我正在对C for循环执行优化,我刚刚阅读了展开和累加器。如果数据不依赖于循环中的每一个,则展开和累加器的使用确实利用了并行性,并且代码完成得更快。
所以我天真的想法是,为什么不添加更多累加器并多次展开?
我做到了这一点,并注意到每个元素的平均周期减少收益递减。
我的问题是为什么?
答:是因为我们的寄存器用完了同时工作,而信息需要存储在内存中吗?
B:或者是因为'清理循环'必须在展开循环后处理更多元素?
是A和B的组合吗?
答案 0 :(得分:3)
我不确定我是否只是在这里说明显而易见的事情,但主要之所以看到你从展开中看到的收益递减,仅仅是因为你&#39在很大程度上消除了循环中的开销,并且CPU上的剩余时间几乎全部花在"有用的"你正在做的工作。
展开的好处是你可以消除循环本身的开销 - 即索引增量,比较,分支和& c。 - 而不是它使循环的有用工作更快。当你已经达到了大部分消除循环开销的程度时,很明显你不会看到更多展开的进一步改进。
另一方面,进一步展开的某些方面肯定会使性能变差,例如寄存器溢出内存,I-cache工作效率低下,循环对于跟踪缓存来说太大(在处理器上运动这样的),& c。
答案 1 :(得分:1)
更有可能的是,A。我很久以前就已经看过了。我做了同样的问题,我得出的结论是我用完了寄存器,所以没有更快的累加器。处理未展开的其余元素的清理代码运行的时间远远少于主要展开的循环。