程序员是否仍有可能针对支持完整out-of-order executionn的处理器优化数据危害?

最佳答案

能够无序执行的处理器不一定能够消除任何数据危害。乱序执行的实现可能不包括寄存器重命名,因此WAW和WAR危害将导致管道停顿。

但是,大多数现代OoOE处理器都实现了寄存器重命名,从而消除了WAW和WAR危害,但没有RAW危害。如果浮点除法指令后接需要除法结果的指令序列,则流水线可能会停滞很长时间。另一个示例是分支指令依赖于导致页面错误的加载指令的情况。无论该分支的预测是否正确,重排序缓冲区都可能变满或几乎变满,从而可能导致停顿。如果分支预测错误,则罚款会更高。因此,您通常不必担心注册WAW和WAR危险,但是RAW危险很重要。

有几种技术可用于减少RAW危害的影响:


SIMD指令可用于完全重叠多个数据元素的WAR依赖关系的延迟。
包含相互独立的依赖关系链的融合循环,以便可以在超标量CPU中并行执行这些依赖链。这增加了可用执行单元的利用率。
使用较低延迟的指令。例如,可以用左移指令代替乘以2的幂的乘法指令。


通常,优化编译器能够执行这些优化,尽管它可能仍会产生次优的机器代码。

内存依赖性也很重要。特别是,如果存储结果由于某种结构限制而无法转发到负载,则内存RAW依赖项将受到惩罚。由于大多数处理器按程序顺序退出指令,因此内存WAW和WAR危害不会受到惩罚。就是说,在具有强大的内存排序模型(例如x86)的体系结构中,通常,所有存储都必须以程序顺序执行,而与WAW依赖性无关。

还有许多其他可能的性能问题。您可以参考要开发的处理器和/或体系结构的优化指南。

07-24 19:47