打印
[应用相关]

拆解循环-以空间换时间

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

在编写循环处理程序的时候要充分利用CPU的指令缓存,要充分分解小的循环。特别是当循环体本身很小的时候,分解循环可以提高性能。

这里要注意,很多编译器并不能自动分解循环。不好的代码:

// 3D转化:把矢量 V 和 4x4 矩阵 M 相乘
for (i = 0;i < 4;i ++)
{
  r[i] = 0;
  for (j = 0;j < 4;j ++)
  {
    r[i] += M[j][i]*V[j];
  }
}

推荐的代码:

r[0] = M[0][0]*V[0] + M[1][0]*V[1] + M[2][0]*V[2] + M[3][0]*V[3];
r[1] = M[0][1]*V[0] + M[1][1]*V[1] + M[2][1]*V[2] + M[3][1]*V[3];
r[2] = M[0][2]*V[0] + M[1][2]*V[1] + M[2][2]*V[2] + M[3][2]*V[3];
r[3] = M[0][3]*V[0] + M[1][3]*V[1] + M[2][3]*V[2] + M[3][3]*v[3];

使用特权

评论回复
沙发
kzlzqi| | 2024-7-29 15:31 | 只看该作者
循环展开是一种优化技术,通过手动将循环体展开,从而减少循环的开销和提高指令级并行性。

使用特权

评论回复
板凳
kzlzqi| | 2024-7-29 15:31 | 只看该作者
你提供的例子展示了如何将一个嵌套的循环展开为一个连续的操作序列。这种方法特别有效于小的循环体,因为这样可以减少循环控制的开销和提高指令的缓存命中率。

使用特权

评论回复
地板
申小林一号| | 2024-7-29 22:45 | 只看该作者
感谢分享

使用特权

评论回复
5
喂什么玩意| | 2024-7-31 11:43 | 只看该作者
减少循环控制开销:去除了循环控制的开销,如索引更新和条件判断。提高指令级并行性:指令可以并行执行,因为每个 r 的计算是独立的。提升缓存性能:减少了缓存未命中的可能性,因为相同的数据访问模式在每次迭代中更连贯。

使用特权

评论回复
6
AdaMaYun| | 2024-7-31 13:30 | 只看该作者
特别是当循环体本身很小的时候,分解循环可以提高性能。

使用特权

评论回复
7
为你转身| | 2024-8-31 13:46 | 只看该作者
在编写循环处理程序时,充分利用CPU的指令缓存确实可以显著提高性能,尤其是在处理小型循环体时。

使用特权

评论回复
8
花间一壶酒sd| | 2024-8-31 21:57 | 只看该作者
循环分解是一种优化技术,通过将大循环拆解成多个小循环,以充分利用CPU的指令缓存和流水线,从而提高执行效率。

使用特权

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

本版积分规则

282

主题

2156

帖子

4

粉丝