我正在尝试使用循环展开来优化我的代码。
这是原始代码
int a[N]; //arbitrary array
int vara; //arbitrary variable
int varb; //arbitrary variable
for (int i=0;i<N;i++)
a[i]=(a[i+1]* vara) + varb;
所以我尝试这样做
for (int i=0;i<N-1;i+=2)
{
int a=a[i+1]*vara;
int b=a[i+2]*vara;
int c=a+varb;
int d=b+varb;
a[i]=c;
a[i+1]=d;
}
我认为这会起作用,因为我使编译器能够一次对多个迭代进行加法和乘法,我认为这会增加指令级并行性。然而这样做根本不会加速我的代码,我做错了什么?
任何其他优化此代码的建议也将不胜感激。
最佳答案
您的编译器很可能已经在高优化级别展开,也许您需要 -funroll-loops
或类似的东西。但即使是文档也警告说,这并不是提高速度的神奇选择,因为它会消耗指令缓存和程序空间。
循环展开基本上就是您所做的:只需较少的循环迭代并完成多个较小迭代的工作。它是否更快很大程度上取决于循环体和代码运行的实际机器。
只有当跳转成本昂贵并且存在指令级并行性增益时,展开才有意义,考虑到现代处理器中的反依赖性和调整的分支预测器,这种情况不太可能发生。
也就是说,您至少需要运行一些带有统计分析的微基准测试。
如果我必须冒险一种方法来提高速度:删除对数组中下一个元素的依赖。然后,这会变成一个基本的 vector 乘法累加,这对于向量化来说很简单。
关于c - 如何使用循环展开和重新关联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50752954/