【问题标题】:Which kinds of reordering optimizations do x86 CPUs do?x86 CPU 做了哪些类型的重新排序优化?
【发布时间】:2014-05-28 11:21:14
【问题描述】:

Eric Lippert 在他的blog post 中说:

我注意到,在基于 x86 的硬件上,实际上从未观察到这种特殊的写入重新排序;这些 CPU 不执行此优化。

这是否意味着 x86 CPU 不存在在讨论读写的易变性和重新排序时所讨论的任何问题,或者他的意思是仅在此示例中 CPU 不会重新排序?

在 x86_64 CPU 中会发生哪些类型的重新排序以及在哪些情况下?

【问题讨论】:

  • 为此使用Intel Processor manuals。内存排序规则在第 3A 卷第 8.2.2 章中描述
  • 我的意思是我所说的:x86 不会重新排序两个相对于彼此的写入。然而,它确实重新排序读取相对于写入;读取可以在时间上逻辑地向后移动,或者在时间上逻辑地向前移动。想象一下,您有主内存,并且芯片上有主内存的副本。如果您从主存储器预取一个页面到芯片上以获取一个字节,那么这实际上是提前读取了该页面的 all ;如果您随后从该页面获得另一个字节,则它已被复制。如果您写入副本,该写入可能会在稍后被刷新,延迟写入。
  • 您还应该阅读该文章的后续文章:blog.coverity.com/2014/03/26/reordering-optimizations

标签: c# optimization clr cpu


【解决方案1】:

这是否意味着 x86 CPU 不存在在讨论读写的易变性和重新排序时所讨论的任何问题,或者他的意思是仅在此示例中 CPU 不会重新排序?

这意味着 stores 在 x86 CPU 中没有重新排列; loads 仍然可以向后移动。然后,了解 x86 的含义很重要。在这篇文章的上下文中,它仅表示 x86 而不是它的衍生版本。 x86 oostore 架构支持比基本 x86 实现更多的内存重新排序。您可以在此处获取所有详细信息: http://en.wikipedia.org/wiki/Memory_ordering

这个用例有很多例子,如下所示:

此外,在此架构上,重新排序不能跨越方法调用边界。

除了重新排序之外,几乎任何 CPU 架构都可以缓存值,这是一种更加明显的优化。这是此优化的一个很好的用例:

http://www.codeproject.com/Articles/389730/The-unsung-hero-Volatile-keyword-Csharp-threading

【讨论】:

  • 您是否有证据表明重新排序不会交叉调用?我正在研究这个主题,但无法确认。
  • 如果我没记错的话,知名 CPU 架构师 Ivan Godard 在关于 Mill CPU 预测的演讲中提到了它。不幸的是,我现在没有时间仔细检查。无论如何,这是链接:millcomputing.com/docs/prediction
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
  • 2012-12-05
  • 2012-05-13
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多