【发布时间】:2013-10-19 13:57:55
【问题描述】:
有人可以解释为什么 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 自动进行这种转换?
【问题讨论】:
标签: c++ c for-loop compiler-optimization icc