小编zan*_*ato的帖子

x86 TSO 内存模型上的“存储缓冲区”试金石测试名称的原因

我一直在研究内存模型并看到了这个(引用自https://research.swtch.com/hwmm):

Litmus Test: Write Queue (also called Store Buffer)
Can this program see r1 = 0, r2 = 0?
// Thread 1           // Thread 2
x = 1                 y = 1
r1 = y                r2 = x
On sequentially consistent hardware: no.
On x86 (or other TSO): yes!

Run Code Online (Sandbox Code Playgroud)
  • 事实1:这是很多文章中提到的存储缓冲区试金石。他们都说,由于存储缓冲区的存在,TSO 上可能会发生 r1 和 r2 为零的情况。他们似乎假设所有存储和加载都按顺序执行,但结果是 r1 和 r2 都为零。后来得出的结论是“存储/加载重新排序可能会发生”,作为“存储缓冲区存在的后果”。

  • 事实 2:但是我们知道 OoO 执行也可以重新排序两个线程中的存储和加载。从这个意义上说,无论存储缓冲区如何,只要所有四个指令都在没有看到彼此对 x 或 y 无效的情况下退出,这种重新排序就可能导致 r1 和 r2 都为零。在我看来,“存储/加载重新排序可能会发生”,只是因为“它们是无序执行的”。(我对此可能是非常错误的,因为这是我所知道的最好的猜测和 OoO 执行。)

我想知道这两个事实是如何融合的(假设我碰巧对这两个事实都是正确的):存储缓冲区或 OoO 执行是“存储/加载重新排序”的原因,还是两者都是?

换句话说:假设我以某种方式在 x86 机器上观察到了这个试金石,是因为存储缓冲区还是 …

x86 cpu-architecture memory-model memory-barriers

4
推荐指数
1
解决办法
524
查看次数