高屋建瓴
优化程序性能的最基本策略:
①高级设计。为问题选择合适的算法以及数据结构。避免产生渐进糟糕性能高的算法。
②基本编码原则。避免限制优化的因素,方便编译器产生高效的代码。
a,消除连续的函数调用。在可能时,将计算移动到循环之外。有选择的妥协程序的模块性以获得更大的效率。
b,消除不必要的内存引用。引用临时变量来保存中间结果(私以为:可以在C++中用寄存器变量达到这一效果),在最后的值计算出来时才将结果放入数组或者全局变量中。
③低级优化。结构化代码以利用硬件功能。
a,展开循环,降低开销。
b,通过利用多个累计变量、重新结合等技术,提高指令级并行。
c,用功能性的风格重写条件操作,使得编译采用条件数据传送。
一些基础概念:
cpe — 每元素的周期数。这是一个系数。运行速度= constant + K * linefactor = constant + CPE*K (k表示迭代循环次数);当迭代次数足够大时,CPE决定程序运行的书读;
渐进低效率 — 当循环次数足够大时,循环内部的函数会降低执行效率。循环次数小时,这种降低并不明显;
指令级并行 — 在代码级,看上去是一次执行一条指令。实际上是一次执行多条指令,并由一些机制保证这种执行行为符合顺序语义模型的效果。
延迟界限 — 下一条指令开始之前,这条指令必须结束。当代码中数据相关限制了处理器利用指令级并行的时候,延迟界限会限制程序性能。
吞吐量界限 — 程序性能的终极限制。
题目:6的CPE高于5。
原理我也不是太懂。但是可以这样思考:
6的PCE,不会算。但是不存在并行。分解7:result=ai + tmp;tmp = xresult;二者可以并行吗?假设可以。第一个周期并行执行result,tmp,显然不行,算result需要用到tmp。第一个周期算tmp,二周期并行执行result,tmp,亦不行,算tmp需要新的result。
5的PCE,不会算。但是肯定值存在并行运算的,比如这种情况:第一周期并行执行tmp=aixpwr,xpwr=xxpwr;第二周期执行result += tmp,tmp=aixpwr,xpwr=x*xpwr,没有毛病。