常数优化之循环展开
背景
各位读者可能在兴高采烈要死要活地码完一道题兴奋地交题后也遇到过下面的情况:
或者更OI一点:
大家大概都是一边抱怨毒瘤出题人,一边真香地改代码。如果复杂度是对的,那就要考虑程序的常数是不是太大了,进而考虑怎么优化。啥,你说开O2吸个氧不就完了?yysy,确实问题是正式比赛不知道给不给开,而且编译器优化最重要的是在不改变程序行为的前提下优化,总不能优化错吧,所以如果程序写得实在是很难优化,编译器也无能为力,还是要自己来。考虑到OI选手都是初、高中生巨佬小学生巨佬暂且不考虑,还没有接触大学课程,尤其是深入理解计算机系统这门课,可能对这种方法了解的也比较少,下面就介绍一种不知道常不用的常数优化方法——循环展开就是介绍点深入理解计算机系统(CSAPP)的内容,下文的图片也都出自该书
观前提示:以下内容仅供参考,本大学狗也只是刚学完这门课,有些内容可能有疏漏,为了能将内容讲得更容易理解,说法也不是很严谨
循环展开——CPU友好型代码
原理
流水线
现代CPU采用流水线设计(可以类比汽车生产流水线,分多阶段),把一条机器指令的执行分成多个阶段,然后每个时钟周期尽可能多地执行不同指令的不同阶段,我们可以从下面两张图看出流水线和不流水线的区别:
非流水线:
流水线:
- I1、I2、I3I1、I2、I3I1、I2、I3表示待三条不同的机器指令,A、B、CA、B、CA、B、C代表指令的阶段(当然不止3个,由CPU设计者决定)
显然流水线只要流起来可以大大提高CPU的工作效率,前提是流起来,如果I2I2I2的AA