1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,性能优化实验分析,施爱春,2009/12/7,1,代码优化,“,不成熟的优化乃万恶之源”,-Tony Hoare,前期着重精良的算法设计,后期找出性能瓶颈,,注重传统的优化措施,以底层语言思考,用高级语言编程,2,手工优化的若干级别,最抽象层:选择合适的算法优化程序(与编译器和语,言均无关),低一层:基于所用的高级语言优化代码(不依赖语言,的特定实现),再低一层:考虑代码的组织,优化针对特定的编译器,和函数库(,VC,,,GCC,,,ICC,),最低一层:考虑编译器生成的机器码,调整指令序列,3,常见代码优
2、化方法,减少函数调用,提前计算,循环展开,并行运算,提高,cache,利用率,4,Image Rotate,naive_rotate,缺点:程序局部性不好,循环次数过多,5,First Trying,:分块,尝试分成,4*4,的小块,提高空间局部性,测试,CPE,改进为,1.8,6,Second Trying,:循环展开,采用,32*32,分块,,4*4,路循环展开,注意循环内部语句执行顺序,测试,CPE,改进,2.7,7,Third Trying?,假设分块为,4*4,的矩阵,采用不同的巡回路线,src dest,8,Last Trying,考虑矩形分块,32*1,,,32,路循环展开,并使
3、dest,地址连续,以减少存储器写次数,测得,CPE,改进为,3.5,9,Image Smooth,naive_smooth,10,First Trying,:减少函数调用,函数,avg,,,accumulate_sum,在,smooth,内实现,函数,assign_sum_to_pixel,,,min,,,max,用宏定义,实现,得到的,CPE,改进为,1.6,11,Second Trying,:使用局部变量,让所有的函数调用均集成在,smooth,内,然后确定,求平均值时涉及到的元素,它们的位置用,4,个局部,变量记录下来,求和的像素个数用另外一个局部变量确定,最后做加法和除法,得到的,
4、CPE,改进为,5.0,12,Second Trying,:使用局部变量,13,Third Trying,:使用完全循环展开,分析不同的,avg,情况共有,9,种,,4,个角点位置,,4,个,边带位置,,1,个中央块,因此只需对这,9,种情况分,别讨论,比如左上角点,14,Third Trying,:使用完全循环展开,中央位置,最终测得,CPE,改进为,8.6,15,Last Trying?,减少冗余计算,预先确定操作数的地址,使用指针变量,s0=src+row,s1=src+row-dim,s2=src+row+dim,变常数除法为乘法,/4,等效成,2,/6,等效*,0 x2AAB16,/9,等效成*,0 x1C7216,16,代码优化推荐书籍,Write Great Code Volume 2:Thinking Low-level,,,Writing High-level-Randall Hyde,Software Optimization for High-Performance,Computing:Creating Faster Applications,-K.P.Wadleigh and I.L.Crawford.,17,Thanks!,18,