Извиняюсь, если об этом спрашивают в архивах.Я нашел несколько похожих вопросов, но ни один из них не показался именно тем, что я хотел.У меня есть серия вычислений, которые будут хранить значения в 4 (очень больших) массивах: A, B, C и D. Эти вычисления взаимозависимы, например, для вычисления b [i] может потребоваться использование [i-1].Я способен выразить все в одном цикле, но это приводит к крайним случаям, когда для определенных значений i должны выполняться только некоторые вычисления.Например:
for(i=0;i<end;i++)
{
if(i == 0)
//calculate A[i+1] and B[i+1]
else if (i == end-1)
//calculate C[i-1] and D[i-1]
else
//calculate A[i+1], B[i+1], C[i-1], D[i-1]
}
Из-за проблем с производительностью я бы хотел, чтобы в моем цикле не было условных выражений.Оценка условия будет дешевой по сравнению с расчетами, но, возможно, не пренебрежимо мала.Мой вопрос заключается в том, может ли компилятор надежно расширить это до
//calculate A[1] and B[1]
for(i=1;i<end-1;i++)
{
//calculate A[i+1], B[i+1], C[i-1], D[i-1]
}
//calculate C[end-2] and D[end-2]
. Я собираю из архивов, что компилятор разбил бы мой цикл, если бы условные выражения были постоянными, но здесь они зависят от i, что в принципе может быть изменено некоторыми из моих расчетов.Будет ли он обнаруживать, что я не вмешиваюсь в переменную итерации и, таким образом, разумным образом разбиваю ее на части?
Дополнительная информация, если вы решите ответить на вопрос, предложив лучший способ выполнения действий:
Первоначально код был написан с 4 циклами, чтобы вычислить элементы для каждого из массивов.Это был самый интуитивно понятный способ написания кода, но он был неэффективным.Поскольку вычисление элементов в одном массиве зависело от элементов в других массивах, это означало, что мне приходилось считывать все 4 массива из памяти во время каждого из 4 циклов.Поскольку эти массивы не помещаются в кеш, это не оптимально, и мне нужен был код, который будет циклически проходить через мои массивы только один раз.
Я также знаю, что могу разорвать свой цикл вручную, и это действительно так.как все в настоящее время делается.Однако в этих вычислениях используются нетривиальные формулы (и я не могу позволить себе потерю производительности при вызове функции во время каждой итерации этого цикла), поэтому разрыв кода привел к дублированию кода, которое не только очень трудно прочитать, но и практически невозможно поддерживать на следующем этапе.время, когда мои формулы будут изменены (что они будут ...)
Заранее спасибо!