为什么数据转发和停顿周期在处理负载使用风险方面比 NOP 更有效?
Why are data forwarding and stall cycles more efficient than NOPs for dealing with load-use hazards?
我们可以同时使用 NOPs
、数据转发和停顿周期来解决数据和加载使用风险。然而,如果我们有多个数据风险,那么使用 NOPs
来解决所有这些问题会变得非常低效,因为它们会增加程序的运行时间。相比之下,如果我们有负载使用风险,我们可以使用数据转发和停顿周期来解决风险,它会提供更有效的结果。我的问题是,与 NOPs
相比,数据转发与停顿周期相结合如何成为处理数据危害的更有效方法?因为当我们添加一个停顿周期时,程序必须等待一个时钟周期以允许数据转发(MEM
到 EX
)。因此时钟周期计数将增加 1.
数据转发克服了一些危险,认识到由先前指令计算的必要值比它出现在寄存器中时更快可用。所以数据转发总是战胜拖延和 NOPs。
当然,停顿有时是必要的,就像您描述的负载使用危险的情况一样。在小的情况下,停顿与 NOP 具有相同的效果,但是:
没有 NOP 的代码更小。代码大小对指令缓存有很大的影响——这会影响性能,因此代码大小不容忽视。
此外,从架构寿命的角度来看,虽然我们可能知道某些微架构设计所需的 NOP 数量,但这很可能会在未来的微架构中发生变化,因此插入旧程序中的 NOP 是不再在较新的硬件上正常工作。因此,我们得出结论,让硬件停顿比插入 NOP 更好。
例如,无序机器可能会在内部重新安排指令以涵盖 MEM->EX 危险(NOP 只会妨碍)。
我们可以同时使用 NOPs
、数据转发和停顿周期来解决数据和加载使用风险。然而,如果我们有多个数据风险,那么使用 NOPs
来解决所有这些问题会变得非常低效,因为它们会增加程序的运行时间。相比之下,如果我们有负载使用风险,我们可以使用数据转发和停顿周期来解决风险,它会提供更有效的结果。我的问题是,与 NOPs
相比,数据转发与停顿周期相结合如何成为处理数据危害的更有效方法?因为当我们添加一个停顿周期时,程序必须等待一个时钟周期以允许数据转发(MEM
到 EX
)。因此时钟周期计数将增加 1.
数据转发克服了一些危险,认识到由先前指令计算的必要值比它出现在寄存器中时更快可用。所以数据转发总是战胜拖延和 NOPs。
当然,停顿有时是必要的,就像您描述的负载使用危险的情况一样。在小的情况下,停顿与 NOP 具有相同的效果,但是:
没有 NOP 的代码更小。代码大小对指令缓存有很大的影响——这会影响性能,因此代码大小不容忽视。
此外,从架构寿命的角度来看,虽然我们可能知道某些微架构设计所需的 NOP 数量,但这很可能会在未来的微架构中发生变化,因此插入旧程序中的 NOP 是不再在较新的硬件上正常工作。因此,我们得出结论,让硬件停顿比插入 NOP 更好。
例如,无序机器可能会在内部重新安排指令以涵盖 MEM->EX 危险(NOP 只会妨碍)。