use*_*312 1 assembly pipeline cpu-architecture microprocessors
维基百科的危害(计算机体系结构)文章:
写后写(WAW)(
i2
试图在写操作数之前写操作数i1
)在并发执行环境中可能发生写后写(WAW)数据危险。示例例如:
Run Code Online (Sandbox Code Playgroud)i1. R2 <- R4 + R7 i2. R2 <- R1 + R3
的写回(WB)
i2
必须延迟到i1
完成执行为止。
我还不明白
如果i2
执行之前有i1
什么问题?
两种操作都会影响R2
。如果i2
写回发生在的写回之前i1
,但i1
最终发生的写回,R2
则将得到结果R4 + R7
而不是的值R1 + R3
。
WAW危害是关于结果值将被后续的写入所覆盖,而该写入不应覆盖该值。
问题不是执行,而是执行。这只是防止这些指令无序执行的写回(如果您未进行寄存器重命名)。
的最终结果R2
(如该对之后的其他后续指令所示)必须匹配程序顺序,因此它必须具有第二条指令的结果。
这就是为什么现代乱序执行CPU使用寄存器重命名(Tomasulo算法)而不仅仅是记分板的原因:它完全消除了WAW和WAR的危害。请参阅我的答案的第一部分,“ 为什么mulss在Haswell上只需要3个周期,而不同于Agner的指令表?从理论上讲,关于寄存器重命名如何使同一寄存器重用于不同结果的另一种解释不成问题。
另请参阅在Intel Sandybridge系列CPU中为管道优化程序,在此我还解释了WAW和WAR的反依赖性不会导致现代乱序执行CPU停顿。
对于写入内存(而不是寄存器),存储缓冲区负责隐藏WAW和WAR危害。