C循环展开限制



我正在对C for循环进行优化,我只是了解了展开和累加器。如果数据在循环中不相互依赖,那么展开和累加器的使用确实利用了并行性,代码完成得更快。

所以我天真的想法是,为什么不添加更多的累加器并展开更多的次数

我这样做了,并注意到每个元素的平均周期的减少会带来递减的回报。

我的问题是为什么

A: 是不是因为我们同时使用的寄存器用完了,信息需要存储在内存中?

B: 还是因为"清理循环"在展开循环之后必须处理更多的元素?

它是a和B的组合吗?

我不确定我是否只是在这里陈述显而易见的东西,但main您看到展开后回报递减的原因很简单,因为您在很大程度上消除了循环的开销,CPU上的剩余时间几乎完全花在了您正在做的"有用"工作上。

展开的好处是消除了循环本身的开销——也就是说,索引增量、比较、分支,&c.——并不是说它使循环的有用工作变得更快。当你已经达到了循环开销基本消除的地步时,很明显,你不会看到更多的展开带来进一步的改进。

另一方面,进一步展开肯定有一些方面会使性能变差,例如寄存器溢出到内存,I-缓存工作效率较低,循环对于跟踪缓存来说太大(在运行这种功能的处理器上),&c.

更有可能的是,A.我不久前就见过。我问了自己同样的问题,得出的结论是我的寄存器用完了,所以没有快速累加器了。处理其余未展开元素的清理代码运行的时间比主展开循环短得多。

最新更新