了解一些限制程序性能的因素
一. 寄存器溢出
如果我们的并行度P超过了可用寄存器的数量,那么编译器就会通知溢出,将某些临时值存放在内存中,通常是运行时堆栈上分配空间,聚个例子,当把combine6的多累积变量模式扩展到k=10或者k=20的时候,我们会发现这种循环展开程度没有改善CPE,有些甚至变差了,现代x86-64处理器有16个寄存器,并可以使用16个ymm寄存器保存浮点数,一点循环变量的数量超过了可用寄存器数量,程序就必须在栈上分配一些变量,从而是操作步骤中增加了从内存读取数据的操作,适得其反。
二. 分值预测错误的惩罚
在一些使用投机执行的处理器中,处理器会预测分支目标处的指令,它会避免修改任何实际的寄存器或者内存位置,知道确定了实际的结果。如果预测正确,那么处理器就会提交投机执行的指令结果,把结果存储到寄存器或者内存,如果预测错误,处理器必须丢掉所有投机执行的结果,在正确的位置,重新开始取值过程,这样做会引起预测错误惩罚,因为在产生有用的结果之前,必须重新填充指令流水线。
那么如何保证分值预测处罚不会阻碍程序效率呢?下面是一些通用的原则:
1. 不要过分关心可预测的分支
我们看到错误的分支预测对程序的性能影响很大,但这并不意味着每一个分支都会拖慢程序的性能,实际上,现代处理器的分支预测逻辑非常善于辨别不同的分支指令的有规律的模式和长期的趋势,例如,在合并函数中,结束循环的分支通常会被预测为选择分支,一次只有在最后一次会导致预