打印
[开发工具]

适当的对循环做展开

[复制链接]
260|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
中国龙芯CDX|  楼主 | 2024-6-27 13:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

这是经典的速度优化,但许多编译程序(如gcc -funroll-loops)能自动完成这个事,所以现在你自己来优化这个显得效果不明显。

旧代码:

for (i = 0; i < 100; i++)
{
  do_stuff(i);
}

新代码:

for (i = 0; i < 10; )
{
  do_stuff(i); i++;
  do_stuff(i); i++;
  do_stuff(i); i++;
  do_stuff(i); i++;
  do_stuff(i); i++;
  do_stuff(i); i++;
  do_stuff(i); i++;
  do_stuff(i); i++;
  do_stuff(i); i++;
  do_stuff(i); i++;
}

可以看出,新代码里比较指令由100次降低为10次,循环时间节约了90%。不过注意: 对于中间变量或结果被更改的循环,编译程序往往拒绝展开,这时候就需要你自己来做展开工作了。

还有一点需要注意,在有内部指令cache的CPU上(如MMX芯片),因为循环展开的代码很大,往往会导致cache溢出,这时展开的代码会频繁地在CPU 的cache和内存之间调来调去,又因为cache速度很高,所以此时循环展开反而会变慢。还有就是循环展开会影响矢量运算优化。

使用特权

评论回复
沙发
kzlzqi| | 2024-7-29 15:35 | 只看该作者
如 GCC 的 -funroll-loops 选项,通常可以自动进行循环展开。编译器会根据循环的复杂性和具体情况决定是否展开循环。手动展开可能在某些情况下无法获得比编译器自动优化更好的效果。

使用特权

评论回复
板凳
纠结的那些年| | 2024-7-31 12:01 | 只看该作者
循环展开可以使处理器更容易进行指令级并行处理,因为在每次展开的循环体中,指令之间的依赖性减少了。这样,现代CPU可以更有效地利用其多个执行单元。

使用特权

评论回复
地板
AdaMaYun| | 2024-7-31 12:40 | 只看该作者
循环展开会影响矢量运算优化

使用特权

评论回复
5
kqh11a| | 2024-8-28 12:21 | 只看该作者
手动展开的代码会变得更加冗长和难以维护,尤其是在需要对循环体进行调整或修改时。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

269

主题

2139

帖子

4

粉丝