gpt4 book ai didi

c - 在哪种情况下 "unroll-loops"不会使结果代码更快?

转载 作者:太空狗 更新时间:2023-10-29 15:00:51 54 4
gpt4 key购买 nike

摘自 GCC 手册:

-funroll-loops
Unroll loops whose number of iterations can be determined at compile time or upon entry to the loop.
-funroll-loops implies -frerun-cse-after-loop. This option makes code larger, and may or may not make it
run faster.

根据我的理解,展开循环会去除结果代码中的分支指令,我认为它对 CPU 流水线更健康。

但为什么它“可能不会让它运行得更快”?

最佳答案

首先,它可能没有什么区别;如果您的条件“简单”并且执行了很多次,分支预测器应该快速选择它并始终正确预测分支直到循环结束,使“滚动”代码的运行速度几乎与展开代码一样快。

此外,在非流水线 CPU 上,分支的成本非常小,因此这种优化可能不相关,代码大小的考虑可能更为重要(例如,在为微 Controller 编译时 - 请记住 gcc 目标范围从 AVR从微型到 super 计算机)。

展开无法加速循环的另一种情况是循环体比循环本身慢得多 - 例如您在主体循环中有一个系统调用,与系统调用相比,循环开销可以忽略不计。

至于什么时候它可能会让你的代码运行得更慢,让代码变大可以减慢它的速度 - 如果你的代码不再适合缓存/内存页面/......你将有一个缓存/页面/。 .. 错误,处理器将不得不等待内存在执行之前获取代码。

关于c - 在哪种情况下 "unroll-loops"不会使结果代码更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17158219/

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