c - 如何使用循环展开和重新关联?

标签 c loops optimization loop-unrolling

我正在尝试使用循环展开来优化我的代码。

这是原始代码

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/

相关文章:

c - 为什么这个宏被定义为({ 1; })?

c - 在矩阵中映射相邻子区域并计算每个子区域的质心

For 循环中的 Python 列表

.net - 逻辑帮助,可能与循环有关

excel - 基于矩阵隐藏/取消隐藏Excel工作表

c - 写入 c 字符串

c++ - Dev C++ Mingw不再编译

python - 如何将 O(N*M) 优化为 O(n**2)?

python - 如何使我的 python 集成更快?

Mysql优化查询: Trying to Get Average of Subquery