【问题标题】:What is the difference in logic and performance between LOCK XCHG and MOV+MFENCE? [duplicate]LOCK XCHG和MOV+MFENCE在逻辑和性能上有什么区别? [复制]
【发布时间】:2013-10-06 10:16:19
【问题描述】:

x86 指令 LOCK XCHGMOV+MFENCE 用于执行顺序一致性存储的逻辑和性能有何不同。

(我们忽略了XCHG的加载结果;gcc以外的编译器使用它来实现存储+内存屏障的效果。)

为了顺序一致性,在执行原子操作期间是否:LOCK XCHG 仅锁定单个缓存行,反之亦然MOV+MFENCE 锁定整个缓存 L3(LLC)?

【问题讨论】:

  • 苹果和橙子,MFENCE 不提供原子性。
  • @Hans Passant 我没有说 MFENCE 提供原子性,因为 MOV 已经是原子的 - 我们可以在 C11(atomic)/C++11(std::atomic) 中看到所有订购在 x86 中,除了 SC(顺序一致性):en.cppreference.com/w/cpp/atomic/memory_order 但我说 MFENCE 为原子变量提供顺序一致性,正如我们在 C11(atomic)/C++11(std::atomic 中看到的那样) 在 GCC4.8.2 中:stackoverflow.com/questions/19047327/…
  • (顺便说一句,我什至不确定mov 是否是非对齐访问的原子。)
  • @Kerrek SB MOV+MFENCE(GCC4.8.2 中的 SC)我们可以将 LOCK XCHG 替换为 SC,正如我们在视频中看到的那样,0:28:20说MFENCE比XCHG贵:channel9.msdn.com/Shows/Going+Deep/…
  • @Alex,也可以在这里查看 - stackoverflow.com/questions/19059542/…

标签: multithreading assembly concurrency x86 cpu-cache


【解决方案1】:

区别在于使用目的。

当我们锁定可从两个或多个线程访问的内存区域的一部分时,MFENCE(或 SFENCE 或 LFENCE)很有用。当我们原子地为这个内存区域设置锁时,我们可以在之后使用所有非原子指令,因为有更快的指令。但我们必须在解锁内存区域之前调用 SFANCE(或 MFENCE)一条指令,以确保锁定的内存对所有其他线程正确可见。

如果我们只更改单个内存对齐变量,那么我们使用的是 LOCK XCHG 等原子指令,因此不需要锁定内存区域。

【讨论】:

  • 不,x86 锁本身就是一个 mfence(甚至在这里的视频中也说过),所以你不需要另一个(更不用说在关键部分的入口/出口处有任何一个定向栅栏了) )。此外,没有锁定 L3 之类的东西,mfence 不锁定任何东西(因此它不确保任何原子性),它只是确保所有内存操作的序列化在使用它的线程中
  • @Alex,我想你把它搞混了——栅栏是 ISA 的生物,在这种情况下是 x86。缓存是实现细节,主要是“在幕后”。由于 MESI/snoops 协议,任何 x86 加载/存储操作都将从其他内核/套接字收集一致的数据。您自己的核心中的修改行也由该协议维护(尽管有一个 ISA 挂钩可以将它们清除 - 但这是使用 wbinvd/clflush,而不是 sfence)。无论哪种方式,硬件的确切行为可能因产品而异(但大多数现代 CPU 不必为这些操作配备昂贵的总线锁)
  • MESIF/MOESI 允许在硬件中进行一些优化,但在这里不相关 - 无论状态如何,锁都会将任何行保持在适当的位置。但是,我不同意您的第二部分 - MFENCE 仅适用于给定线程中的程序顺序,而不适用于其他线程。它在某些一致性情况下可能会有所帮助(正如我在这里写的 - stackoverflow.com/questions/19059542/…),但这只是因为它在内部序列化每个线程,而不是通过任何原子性或您暗示的“缓存锁定”。如果您不这么认为,请通过示例提出问题。
  • @Alex SFENCE 是对共享内存的本地未完成写入的有序刷新。两个核心可以同时执行 SFENCE,第三个核心将看到交错的写入。英特尔说:“单个处理器的写入与其他处理器的写入没有顺序。”
  • 除了错误之外,这并不能回答问题。
猜你喜欢
  • 2020-09-07
  • 2017-03-17
  • 2010-12-14
  • 2014-05-18
  • 1970-01-01
  • 2017-05-05
  • 2014-09-14
相关资源
最近更新 更多