【发布时间】:2015-03-20 02:01:11
【问题描述】:
我正在对 C for 循环进行优化,我刚刚阅读了展开和累加器。如果数据在循环中不相互依赖,那么展开和累加器的使用确实利用了并行性,并且代码完成得更快。
所以我天真的想法是,为什么不添加更多的累加器并展开更多次?
我这样做了,并注意到每个元素的平均周期减少的回报递减。
我的问题是为什么?
A:是不是因为我们的寄存器用完了,需要同时处理,信息需要存储在内存中?
B:还是因为“清理循环”必须在展开循环之后处理更多元素?
是A和B的组合吗?
【问题讨论】:
-
不要忘记展开会给指令缓存带来更大的负担。
-
L1 指令缓存不是大到足以处理 16 个无符号整数吗?当我从 8 到 16 个累加器/展开时,收益可以忽略不计。
-
@filposs:跟踪缓存肯定不是。我认为它只适合大约 50-100 µops。
-
所谓的“收益递减”,不是说一段时间后它会变慢吗?否则,你期待什么,真的吗?你展开的越多,循环就会永远越来越快? (通常,“收益递减”意味着您获得的收益越来越少,而不是越来越差。)
-
@filposs:那么我不禁想知道你在期待什么。您是否期望每个循环“迭代”越展开越快,直到达到零时间?
标签: c optimization