在无序执行中,如果在旧负载之前执行较年轻的存储,会发生什么情况。如果年轻的商店写到相同的地址,那么负载会不会得到错误的数据?我理解内存消歧问题,即当较年轻的负载依赖于旧存储时,这是我问题的另一面。
例:-旧A: Load R1 <- R0(8)年轻B: R2 -> R3(25)
如果B在A之前执行,则R3(25)=R0(8) 也就是说,存储写入地址,然后加载instr在允许执行的情况下获取新数据,这是错误的!!。这个案子是怎么处理的?
发布于 2019-09-08 21:47:09
无序执行是一个微观架构细节。只有在不改变可观察或指定的行为时,CPU才能重新排序指令。在这里,这可以通过以下两种方式之一实现:
在您的示例中,您似乎假设通过不同的寄存器和不同的偏移来访问相同的内存位置会混淆CPU。事实并非如此。CPU只有在能够检测到这样的冲突时才能按顺序执行指令(如果根据其内存模型,这种访问将是冲突)。避免这种冲突的一个简单算法是在加载过程中不执行任何写操作。
发布于 2019-09-09 08:52:14
CPU总是表现得好像所有的指令都是按程序顺序执行的。如果CPU不能同时重新排序指令并保证正确性,则不会重新排序。
如果加载和存储的两个地址都已知,CPU可以检查是否存在冲突,并在从位置x加载之前对位置y执行存储,如果位置已知不同。
如果加载的地址未知,则任何以下存储必须等待。相同的地址,如果地址是相同的,或者不能保证是不同的(在许多体系结构上,相同的数据可以使用多个页面之间的不同地址来访问)。
在设计和硬件上投入多少精力将取决于收益的多少。CPU可能还记得,存储是为了定位,即使您还不能执行该存储,随后从该地址加载的将只是应该存储的值。
PS。有些处理器甚至做一些与分支预测非常相似的事情:如果有一个存储到位置X,然后是从位置Y加载,处理器可以预测X和Y是不同的,或者它们是相同的。在第一种情况下,即使我们不能保证得到正确的结果,也会执行来自Y的负载。在第二种情况下,我们使用存储到X的值作为加载的结果。
在将来的某个时刻,处理器将检测X和Y是否相同,然后继续处理,或者删除不正确的预测结果。
https://softwareengineering.stackexchange.com/questions/397132
复制相似问题