【问题标题】:x86: Are memory barriers needed here?x86:这里需要内存屏障吗?
【发布时间】:2018-10-02 02:26:29
【问题描述】:

在 WB 内存中,a = b = 0

P1:
a = 1
SFENCE
b = 1

P2:
WHILE (b == 0) {}
LFENCE
ASSERT (a == 0)

据我了解,这里不需要SFENCELFENCE

也就是说,因为对于这种内存类型,x86 确保:

  1. 不能用旧的读取重新排序读取
  2. 商店不能与旧商店重新订购
  3. 商店是可传递可见的

【问题讨论】:

  • 是的,不需要它们。 Duplicate。尽管没有SFENCE,但没有特别保证处理器何时决定使写入可见。这在实践中基本上不是问题。
  • @Kay:那是汇编操作的伪代码,因此编译时重新排序是不可能的吗?在 C 中,您需要一个 compiler 屏障,但对于 x86,此处不需要 asm 屏障指令。 lfencesfence asm 指令是无操作的,除非您使用 NT 存储(或 NT 从 WC 内存加载,例如视频 RAM)。
  • @HadiBrais:sfence 不会让商店很快出现,AFAIK。它可能使 CPU 在存储缓冲区耗尽时等待(但可能只有 mfence 这样做,以停止 StoreLoad 重新排序)。已经在缓冲区中的存储已经在尽可能快地提交。
  • @PeterCordes 你是对的。该声明仅在商店位于同一地点时成立。
  • @HadiBrais:哦,对了,我们有一些证据表明同一行的连续存储被合并到存储缓冲区中。 IDK 如果它会延迟第一个的提交,但是,如果它位于存储缓冲区的头部。我猜想在同一行的循环中重复存储仍然会定期提交到 L1d。

标签: x86 memory-model


【解决方案1】:

lfencesfence asm 指令是无操作的,除非您使用 NT 存储(或 NT 从 WC 内存加载,例如视频 RAM)。 (实际上是movntdqa loads might only be ordered by mfence on paper,而不是lfence。在这种情况下,我不知道你什么时候会使用lfence。它与sfence+mfence同时添加到ISA NT 商店,在movntdqa 之前,可能只是为了完整性/以防万一。)

在这一点上有时会引起混淆,因为lfencesfence 的C/C++ 内在函数也是编译器障碍。在 C/C++ 中需要 ,但可以使用 GNU C asm("":::"memory"); 或(订购轻松-atomic 操作1std::atomic_signal_fence(std::memory_order_acq_rel) 更便宜地获得。限制 compile-time reordering 而不使编译器发出任何无用的 asm 屏障指令。


运行时重新排序已被 x86 内存模型阻止,但 StoreLoad reordering 除外,它需要 mfence 才能阻止。 lfence + sfence 不要加起来 mfence。有关这些说明,请参阅 Does it make any sense instruction LFENCE in processors x86/x86_64? 和其他各种 SO Q&A。

这就是为什么std::atomic_thread_fence(std::memory_order_acq_rel) also compiles to zero instructions on x86 的原因,但是对于弱有序架构的障碍。


lfence 也是 Intel 微架构上的序列化指令(但可能不是 AMD?)。一直以来,但英特尔最近将此保证正式化,因此 Spectre 缓解技术可以安全地使用它,而不是更不方便的cpuid


  • 脚注 1:

gcc 上的atomic_signal_fence 也可能是普通非atomic 变量的编译器障碍;这是我最后一次使用 gcc 检查(而 atomic_thread_fence 不是),但这可能只是一个实现细节,因为没有涉及任何 atomic 变量。当有atomic 变量时,编译器知道这些变量可能会提供排序,让其他线程在没有UB 的情况下访问非原子变量,因此需要排序。

【讨论】:

  • 嗨,彼得,感谢您的回复。至于您的评论,是的,这是汇编伪代码,因此不需要编译器障碍。太好了——我很高兴我掌握了窍门。一如既往,感谢您的宝贵时间。
猜你喜欢
  • 2017-01-05
  • 2014-01-20
  • 1970-01-01
  • 1970-01-01
  • 2014-09-01
  • 2011-03-30
  • 2011-10-12
  • 2011-06-09
  • 2015-11-13
相关资源
最近更新 更多