【发布时间】:2018-10-02 02:26:29
【问题描述】:
在 WB 内存中,a = b = 0
P1:
a = 1
SFENCE
b = 1
P2:
WHILE (b == 0) {}
LFENCE
ASSERT (a == 0)
据我了解,这里不需要SFENCE 或LFENCE。
也就是说,因为对于这种内存类型,x86 确保:
- 不能用旧的读取重新排序读取
- 商店不能与旧商店重新订购
- 商店是可传递可见的
【问题讨论】:
-
是的,不需要它们。 Duplicate。尽管没有
SFENCE,但没有特别保证处理器何时决定使写入可见。这在实践中基本上不是问题。 -
@Kay:那是汇编操作的伪代码,因此编译时重新排序是不可能的吗?在 C 中,您需要一个 compiler 屏障,但对于 x86,此处不需要 asm 屏障指令。
lfence和sfenceasm 指令是无操作的,除非您使用 NT 存储(或 NT 从 WC 内存加载,例如视频 RAM)。 -
@HadiBrais:
sfence不会让商店很快出现,AFAIK。它可能使 CPU 在存储缓冲区耗尽时等待(但可能只有mfence这样做,以停止 StoreLoad 重新排序)。已经在缓冲区中的存储已经在尽可能快地提交。 -
@PeterCordes 你是对的。该声明仅在商店位于同一地点时成立。
-
@HadiBrais:哦,对了,我们有一些证据表明同一行的连续存储被合并到存储缓冲区中。 IDK 如果它会延迟第一个的提交,但是,如果它位于存储缓冲区的头部。我猜想在同一行的循环中重复存储仍然会定期提交到 L1d。
标签: x86 memory-model