Извините, если это задано в архивах. Я нашел некоторые подобные вопросы, но ни один из них не казался именно тем, что я хотел.
Дистиллированная версия проблемы, над которой я работаю, выглядит следующим образом. У меня есть серия вычислений для выполнения, которые будут хранить значения в 4 (очень больших) массивах: A, B, C и D. Эти вычисления взаимозависимы, например, для вычисления b [i] может потребоваться использование [i-1]. Я способен выразить все в одном цикле, но это приводит к крайним случаям, когда для определенных значений я необходимо выполнить только некоторые вычисления. Например:
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 циклов. Поскольку эти массивы не вписываются в кеш, это не оптимально, и мне нужен код, который будет циклически проходить через мои массивы только один раз.
Я также знаю, что я могу разбить свою петлю вручную, и именно так дела идут в данный момент. Однако эти вычисления включают нетривиальные формулы (и я не могу позволить себе получить производительность при вызове функции во время каждой итерации этого цикла), поэтому разрывание кода вызвало дублирование кода, которое не только очень трудно читать, но и почти недостижимо следующее время мои формулы получить tweaked (что они будут...)
Спасибо заранее!