【每周至少一篇 160901】循环级别的代码优化(上周补充)
2016-09-01 13:09
225 查看
时间紧,这两周的博客主要回顾一下学习《并行算法设计与性能分析》的小部分,希望以后能养成这些习惯。循环级别的优化以发掘循环的并行性、减少寄存器和缓存的使用为主。
代码进行展开后
如展开6次、累积2次后代码清单如所示:
合并之后的代码为:
循环展开
目的是减少判断数量和改变循环变量的次数。同时注意不易展开过多,要考虑寄存器的数量。float sum = 0.0f; for(int i = 0; i < num; i += 4){ sum += a[i]; }
代码进行展开后
float sum = 0.0f, sum1 = 0.0f, sum2 = 0.0f,sum3 = 0.0f; for(int i = 0; i < num; i += 4){ sum1 = a[i + 1]; sum2 = a[i + 2]; sum3 = a[i + 3]; sum = a[i + 4]; } sum += sum1 + sum2 +sum3;
循环累积
循环累积主要和循环展开同时使用,在减少寄存器使用的同时保证并行度如展开6次、累积2次后代码清单如所示:
float sum = 0.0f, sum1 = 0.0f, sum2 = 0.0f; for(int i = 0; i < num; i += 6){ sum1 = a[i] + a[i +1]; sum2 = a[i +2] + a[i + 3]; sum = a[i + 4] + a[i +5]; } sum += sum1 +sum2;
循环合并
循环的合并减少判断的次数,还能增加指令并行能力for(int i = 0; i < len; i++){ x1 += a[i]; } for(int i = 0; i < len; i++){ x2 *= b[i]; }
合并之后的代码为:
for(int i = 0; i < len; i++){ x1 += a[i]; x2 += b[i]; }
循环拆分
当循环内的变量导致寄存器使用过多,而引发内存和寄存器之间数据交换使得性能下降时,应当实现循环拆分。总结
在面向对象的编程思想中,关于代码与机器相联系的部分比较少。在整体编程中,以面向对象等高级语言来实现结构优化,以靠近硬件和编译器的角度,来实现降低程序执行时间。相关文章推荐
- 【每周至少一篇 160901】语句级别的代码优化
- 关于代码速度优化,MDK中 static 与优化级别与典型for循环之间的关系
- 浅谈SAP 中ABAP循环和取数代码优化
- 2013年新的开始,每周至少要写一篇博客!
- 编译器级别的代码优化对比
- ios DatePicker 自定义,参考他人代码,整理...优化, 循环滑动scrollview
- 转载一篇关于如何优化java代码和提高效率的文章
- 简易代码优化——展开循环
- 【每周至少一篇 160727】简单的选择问题(select problem)_Java
- 新博客 每周至少更新一篇 欢迎大家前来指教
- YourPHP 上一篇下一篇优化代码「适应各种模型」
- 代码细节的终极优化之循环展开、多路并行
- 转载的一篇关于如何优化JAVA代码及提高效率的文章
- 系统性能调优(5)----Java循环与字符串代码优化
- 系统性能调优(5)----Java循环与字符串代码优化
- 循环求和中的代码优化
- 转载的一篇关于如何优化JAVA代码及提高效率的文章
- 2013年新的开始,每周至少要写一篇博客!
- Java循环与字符串代码优化
- 一篇关于如何优化JAVA代码及提高效率的文章