展开循环来加速计算

对于循环次数较为有限的for循环,可通过手工展开该循环达到消除此循环的目的,达到加速运行的目的,下面给出一个代码段实例。

1、for循环体

1 // Q为常数
2 for ( k = 0; k < Q; k++ ) {
3     for ( int j = 0; j < Q; j++ ) {
4         m[k] += fp[z][y][x][j] * mat_M[k][j];
5     }
6 }

此段代码由两重循环构成,Q为常数,尝试将内层循环展开来消除内层循环。

 

2、内存循环展开

1 for ( k = 0; k < Q; k++ ) {
2     m[k] = fp[z][y][x][0] * mat_M[k][0] + fp[z][y][x][1] * mat_M[k][1] + fp[z][y][x][2] * mat_M[k][2] + fp[z][y][x][3] * mat_M[k][3] + fp[z][y][x][4] * mat_M[k][4]
3            + fp[z][y][x][5] * mat_M[k][5] + fp[z][y][x][6] * mat_M[k][6] + fp[z][y][x][7] * mat_M[k][7] + fp[z][y][x][8] * mat_M[k][8] + fp[z][y][x][9] * mat_M[k][9]
4            + fp[z][y][x][10] * mat_M[k][10] + fp[z][y][x][11] * mat_M[k][11] + fp[z][y][x][12] * mat_M[k][12] + fp[z][y][x][13] * mat_M[k][13] + fp[z][y][x][14] * mat_M[k][14]
5            + fp[z][y][x][15] * mat_M[k][15] + fp[z][y][x][16] * mat_M[k][16] + fp[z][y][x][17] * mat_M[k][17] + fp[z][y][x][18] * mat_M[k][18];
6 }

展开内层循环,将两重循环变为一重循环。

 

3、对比

展开前,代码运行时间为66s,展开后,运行时间51s,运行时间缩短22.7%,运行加速效果还是非常显著,考虑到此段代码为整个程序的运行热点段,对整个程序运行也将带来一定的速度提升。

如上所述,展开内层循环已经有了显著的加速效果,进一步展开外层循环,不知是否能进一步加速代码,减少运行时间,有待进一步验证。

转载于:https://www.cnblogs.com/kljfdsa/p/9027991.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值