如果处理器支持乱序执行,优化数据风险是否有意义?
Does it make sense to optimize data hazards if a processor supports out-of-order execution?
程序员是否还有可能为支持完整 out-of-order executionn 的处理器优化数据危害?
能够乱序执行的处理器不一定能够消除任何数据危害。乱序执行实现可能不包括寄存器重命名,因此 WAW 和 WAR 危险将导致流水线停顿。
然而,大多数现代 OoOE 处理器实现了寄存器重命名,从而消除了 WAW 和 WAR 危险,但不是 RAW 危险。如果浮点除法指令后跟需要除法结果的指令序列,则流水线可能会停滞很长时间。另一个例子是分支指令依赖于导致页面错误的加载指令。无论对该分支的预测是否正确,重新排序缓冲区都可能变满或几乎变满,从而可能导致停顿。如果分支预测错误,惩罚会高得多。所以你通常不必担心注册 WAW 和 WAR 危害,但 RAW 危害很重要。
有一些技术可用于减少 RAW 危害的影响:
- SIMD 指令可用于完全重叠多个数据元素的 WAR 依赖项的延迟。
- 融合包含相互独立的依赖链的循环,以便链可以在超标量中并行执行 CPU。这增加了可用执行单元的利用率。
- 使用延迟较低的指令。例如,乘以 2 的幂的指令可以用左移指令代替。
通常,优化编译器能够执行这些优化,尽管它可能仍会生成次优的机器代码。
内存依赖也很重要。特别是,如果存储结果由于某些结构限制而无法转发到加载,内存 RAW 依赖项将招致惩罚。内存 WAW 和 WAR 危险没有惩罚,因为大多数处理器按程序顺序退出指令。也就是说,在具有强大内存排序模型(例如 x86)的架构中,通常,所有存储都必须按程序顺序执行,而不管 WAW 依赖性如何。
还有许多其他可能的性能问题。您可以参考您正在开发的处理器and/or架构的优化指南。
程序员是否还有可能为支持完整 out-of-order executionn 的处理器优化数据危害?
能够乱序执行的处理器不一定能够消除任何数据危害。乱序执行实现可能不包括寄存器重命名,因此 WAW 和 WAR 危险将导致流水线停顿。
然而,大多数现代 OoOE 处理器实现了寄存器重命名,从而消除了 WAW 和 WAR 危险,但不是 RAW 危险。如果浮点除法指令后跟需要除法结果的指令序列,则流水线可能会停滞很长时间。另一个例子是分支指令依赖于导致页面错误的加载指令。无论对该分支的预测是否正确,重新排序缓冲区都可能变满或几乎变满,从而可能导致停顿。如果分支预测错误,惩罚会高得多。所以你通常不必担心注册 WAW 和 WAR 危害,但 RAW 危害很重要。
有一些技术可用于减少 RAW 危害的影响:
- SIMD 指令可用于完全重叠多个数据元素的 WAR 依赖项的延迟。
- 融合包含相互独立的依赖链的循环,以便链可以在超标量中并行执行 CPU。这增加了可用执行单元的利用率。
- 使用延迟较低的指令。例如,乘以 2 的幂的指令可以用左移指令代替。
通常,优化编译器能够执行这些优化,尽管它可能仍会生成次优的机器代码。
内存依赖也很重要。特别是,如果存储结果由于某些结构限制而无法转发到加载,内存 RAW 依赖项将招致惩罚。内存 WAW 和 WAR 危险没有惩罚,因为大多数处理器按程序顺序退出指令。也就是说,在具有强大内存排序模型(例如 x86)的架构中,通常,所有存储都必须按程序顺序执行,而不管 WAW 依赖性如何。
还有许多其他可能的性能问题。您可以参考您正在开发的处理器and/or架构的优化指南。