gpt4 book ai didi

c++ - icc 不执行循环不变代码运动

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:25:52 28 4
gpt4 key购买 nike

有人可以解释为什么 icc 在下面的代码 1 中没有执行循环不变代码运动(移动 a 的指针赋值)的原因。当 a 指针赋值从代码 2 中完成的 t6 循环中移出时,我看到性能提高了 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 自动执行此转换?

最佳答案

似乎 a_translbv 都是在外部作用域中定义的,而不是常量。你不能期望 icc 足够聪明来理解 a 不会改变。对于像 a_translbv 这样的大范围变量,编译器会将它们分配到 RAM 中。它们有可能在循环期间被改变。事实上,如果它们被定义为局部变量(在寄存器中分配),编译器可能会对其进行优化。

      for (t4=256*t1; t4<=256*t1+254; t4++) {
lbv=256*t2;
ubv=256*t2+255;
const int local_lbv=lbv;
const double** local_a_trans=a_trans;
for (t6=lbv; t6<=ubv; t6++) {
double *restrict const a = local_a_trans[local_lbv /256];
a[t6-lbv]=a[t6-lbv]/a[t6-lbv];
}
}

通常,编译器旨在编译和优化人类编写的代码,而不是源代码翻译器。

另一方面,您可以尝试使用 -O3-ipo 进行更积极的代码优化

编辑

尝试定位变量后,性能仍然没有提高。我想我们可以得出结论,代码生成器不会生成具有足够高性能的代码。自动生成后建议手动改写。

关于c++ - icc 不执行循环不变代码运动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19466839/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com