有人可以解释为什么 icc 在下面的代码 1 中没有执行循环不变代码运动(a 的移动指针分配)的原因。当 a 指针分配移出 t6 循环时,如代码 2 中所做的那样,我看到性能提高了 40%。我尝试将指针“a”标记为 const 和限制,让编译器知道指针“a”不会在 t6 循环内更改。我在 icc 中使用 -ansi-alias 选项编译代码。
//代码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 自动进行这种转换?