【问题标题】:Why does GCC use mov/mfence instead of xchg to implement C11's atomic_store?为什么 GCC 使用 mov/mfence 而不是 xchg 来实现 C11 的 atomic_store?
【发布时间】:2014-09-14 14:36:33
【问题描述】:

C++ and Beyond 2012: Herb Sutter - atomic<> Weapons, 2 of 2 Herb Sutter 中(大约 0:38:20)认为应该使用 xchg,而不是 mov/mfence 在 x86 上实现 atomic_store。他似乎还暗示这个特定的指令顺序是每个人都同意的。但是,GCC 使用后者。为什么 GCC 使用这个特定的实现?

【问题讨论】:

标签: c gcc atomic memory-barriers


【解决方案1】:

很简单,movmfence 方法更快,因为它不会触发像 xchg 这样需要时间的冗余内存读取。 x86 CPU 保证线程之间写入的严格顺序,所以这就足够了。

请注意,一些非常旧的 CPU 在 mov 指令中有一个错误,这使得 xchg 是必要的,但这是很久以前的事情了,解决这个问题对于大多数用户来说不值得。

感谢 @amdn 提供有关旧 Pentium CPU 中导致过去需要 xchg 的错误的信息。

【讨论】:

  • 我很好奇为什么 Herb Sutter 争论(2012 年)当时使用 xchg,因为他似乎在这个问题上知识渊博。
  • @tibbe 我个人的猜测是 xchg 在过去的某个时候更好,我发现了各种过时的文档,mfence + mov 在某些 Athlon 上运行缓慢,并且在一些早期的奔腾上坏了。可能该建议曾经是明智的,但只是有点过时了,请注意他可能在演讲前一段时间首先进行了研究,并且即使在那时也可能在过时的 CPU 上进行了研究,我可以看到他有可能做到这一点结论。然而,几乎所有文档都说 mov mfence 路径在现代 CPU 上更快,如果不是很旧的话。
猜你喜欢
  • 1970-01-01
  • 2012-02-20
  • 2013-10-06
  • 2014-04-11
  • 2013-09-30
  • 2017-03-17
  • 2019-10-05
  • 2021-01-22
相关资源
最近更新 更多