Может ли кто-нибудь объяснить причину, по которой icc не выполняет циклически инвариантное движение кода (назначения перемещения указателя a) в коде 1 ниже. Я вижу улучшение производительности на 40%, когда назначение указателя a перемещается из цикла t6, как это сделано в коде 2. Я попытался пометить указатель «a» как константу и ограничить, чтобы компилятор знал, что указатель «a» не будет быть изменен внутри цикла t6. Я компилирую код с опцией -ansi-alias в icc.
//код 1
for (t4=256*t1; t4<=256*t1+254; t4++) {
lbv=256*t2;
ubv=256*t2+255;
for (t6=lbv; t6<=ubv; t6++) {
double *restrict const a = a_trans[lbv /256]; //loop invariant code
a[t6-lbv]=a[t6-lbv]/a[t6-lbv];
}
}
//код 2
for (t4=256*t1; t4<=256*t1+254; t4++) {
lbv=256*t2;
ubv=256*t2+255;
double *restrict const a = a_trans[lbv /256];
for (t6=lbv; t6<=ubv; t6++) {
a[t6-lbv]=a[t6-lbv]/a[t6-lbv];
}
}
Этот код генерируется транслятором исходного кода. Очень утомительно вручную применять это преобразование к большому количеству циклов. Есть ли способ позволить icc автоматически выполнять это преобразование?