多年前,我开始学习x86汇编程序,CPU流水线,缓存未命中,分支预测以及所有这些爵士乐。

这是一个两半的故事。我了解了冗长的流水线在处理器中的所有奇妙优点,即指令重排序,高速缓存预加载,依赖项交织等。

不利的一面是,任何偏离规范的代价都很高。例如,每当您通过指针(!)调用函数时,千兆赫时代早期某个AMD处理器的IIRC就有 40周期惩罚,这显然是正常的。

这不是一个微不足道的“不用担心”数字! 请记住,“好的设计”通常意味着“尽可能多地考虑功能”和“在数据类型中编码语义”,这通常意味着虚拟接口(interface)。

折衷方案是不执行此类操作的代码每个周期可能获得两个以上的指令。这些是编写高性能C++代码时要担心的数字,这些代码在对象设计上很繁琐,而数字运算却很繁琐。

我知道,随着我们进入低功耗时代,CPU长期流水线的趋势已经逆转。这是我的问题:

对于虚拟函数调用,错误的分支预测等,最新一代的x86兼容处理器是否还会遭受巨大的惩罚?

最佳答案


嗯..这么大..
如果前段时间存在相同的间接跳转,则有一个“间接分支预测”方法可以帮助预测虚函数跳转。初次和错误预测的侵权行为仍然会受到惩罚。功能跳转。
支持范围从简单的“仅当先前的间接分支完全相同时才能正确预测”到非常复杂的两级数十或数百个条目,可检测单个间接jmp指令的2-3个目标地址的周期性交替。
这里有很多演变...
http://arstechnica.com/hardware/news/2006/04/core.ars/7

http://www.realworldtech.com/page.cfm?ArticleID=rwt051607033728&p=3

http://www.realworldtech.com/page.cfm?ArticleID=RWT102808015436&p=5

http://www.agner.org/optimize/microarchitecture.pdf

和相同的pdf,第14页

Agner的手册对许多现代CPU中的分支预测器以及每个制造商的cpus中的预测器(x86 / x86_64)进行了详细描述。
还有很多理论上的“间接分支预测”方法(请看Google学者);甚至维基也说了一些关于http://en.wikipedia.org/wiki/Branch_predictor#Prediction_of_indirect_jumps /
对于来自agner微观机构的Atoms:

因此,对于低功率,间接分支预测不是那么先进。 Via Nano也是如此:

我认为,低功耗x86的较短流水线具有较低的惩罚(7-20个滴答)。

07-24 09:44
查看更多