维基百科的Hazard (computer architecture)文章:
写后写(WAW)(
i2
尝试在写操作数之前写 由i1
写入)写入后可能会发生写入后写入(WAW)数据危险 并发执行环境。示例例如:
i1. R2 <- R4 + R7 i2. R2 <- R1 + R3
i2
的回写(WB)必须为 延迟到i1
执行完毕。
我不明白。
如果在i2
之前执行i1
会出现什么问题?
答案 0 :(得分:6)
这两项操作都会影响R2
。如果i2
回写发生在i1
的写回之前,但最终发生i1
的回写,则R2
的结果为R4 + R7
而不是R1 + R3
的值。
WAW危险涉及结果值被随后的写操作覆盖,而该写操作不应覆盖该值。
答案 1 :(得分:6)
这不是问题,而是执行问题。只是回写可以防止这些指令的乱序执行(如果您没有进行寄存器重命名的话)。
R2
中的最终结果(如该对之后的其他后续指令 所示)必须匹配程序顺序,因此必须具有第二条指令的结果。
这是为什么现代乱序执行CPU使用寄存器重命名(Tomasulo算法),而不仅仅是记分板:它完全消除了WAW和WAR的危害。有关寄存器重命名如何使同一寄存器重用于不同结果的理论上的解释,请参见我对Why does mulss take only 3 cycles on Haswell, different from Agner's instruction tables?的回答的第一部分,以获得另一种理论上的解释。
另请参阅Deoptimizing a program for the pipeline in Intel Sandybridge-family CPUs,在这里我还解释了WAW和WAR的反依赖性不会导致现代乱序执行CPU停顿。
对于写入内存(而不是寄存器),存储缓冲区负责隐藏WAW和WAR危险。