【问题标题】:How memory barrier/fence inhibit instruction reordering carried out by CPU?内存屏障/栅栏如何抑制 CPU 执行的指令重新排序?
【发布时间】:2016-03-29 18:51:47
【问题描述】:

据我所知,编译器和CPU都可以进行指令重排序。 通过“由 CPU 执行”,我的意思是我不关心由编译器完成的指令重新排序以及由 Store Buffer 和 CPU 缓存引起的重新排序。 对于由 Store Buffer 和 CPU Cache 引起的重新排序,在 this 论文中讨论过,我已经了解了内存屏障如何抑制这种重新排序(内存重新排序)。

我关心的是这样的重新排序:

源代码:

data=1; //statement1
ready=true;//statement2

但是,在 CPU0 上运行的 ThreadA 按以下顺序执行上述代码:

ready=true;//statement2
data=1; //statement1

也就是说CPU重新排序指令,导致实际执行顺序与源代码指定的顺序不同。 众所周知,如果我们想保持源代码的顺序,我们可以求助于内存屏障(或栅栏),如:

新的源代码:

data=1; //statement1
smp_wb();//Insert a write barrier here!
ready=true;//statement2

所以我的问题来了:内存屏障如何抑制指令重新排序?

【问题讨论】:

  • 如果你问内存屏障的实现,这个实现是编译器特定的架构特定的。您需要选择具体编译器(和编程语言),并查看其有关内存屏障的文档。以此类推,您需要选择特定处理器(或系列),并查看其有关屏障的规范。如果您未能理解其中一些资源,您可以提出更具体的问题。
  • 谢谢@Tsyvarev。我查看了 ARM 的document,发现它通过停止 CPU 管道确保排序。

标签: multithreading memory-barriers


【解决方案1】:

@Tsyvarev 是正确的,它是特定于处理器(或处理器系列)的。 例如,在 ARM 下,DMB(内存屏障)会导致 CPU 流水线停顿以确保排序(防止重新排序),正如其 documentation 所说:

图 1 显示了用于确保内存的 DMB 指令 通过停止管道进行排序

【讨论】:

    猜你喜欢
    • 2021-12-02
    • 1970-01-01
    • 2022-09-23
    • 2016-12-27
    • 2017-07-28
    • 2017-07-31
    • 2021-03-19
    • 2018-10-23
    • 2011-11-12
    相关资源
    最近更新 更多