gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:48:03 29 4
gpt4 key购买 nike

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

这是原始代码

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/

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