除了防止重新排序指令外,内存屏障还执行哪些任务?

时间:2017-03-08 07:47:42

标签: c multithreading memory-barriers

我知道内存屏障会阻止从内存之前到内后重新排序指令,例如,如果我有以下指令:

instruction 1
instruction 2
instruction 3
memory barrier
instruction 4
instruction 5
instruction 6

可以按以下顺序执行这些说明:

instruction 3
instruction 1
instruction 2
memory barrier
instruction 6
instruction 5
instruction 4

但它们永远不会按以下顺序执行:

instruction 1
instruction 2
instruction 5
memory barrier
instruction 4
instruction 3
instruction 6

但我不确定以下任务是否也由内存屏障强制执行:

  • 内存屏障完成之前的所有待处理操作。
  • 刷新内存屏障之前写入操作中仍在缓存中的所有数据。

2 个答案:

答案 0 :(得分:0)

至少对于IBM的powerPC,不能保证完成,c.f。 IBM's documentation

   [eieio指令的执行或完成]并不意味着由eieio之前的指令引起的存储访问已经完成。指令创建的屏障将确保屏障分隔的所有访问都按指定的顺序执行,但是在屏障之前发出的访问可能在eieio指令完成很久之后才会执行

答案 1 :(得分:0)

从技术上讲,内存屏障不会强制执行任何指令。它限制了指令执行中的顺序变为可见给其他观察者。

不需要刷新到内存,实际上会大大减慢基于缓存的体系结构。例如,考虑一个核心,该核心维护未决内存操作的私有队列,并具有与其他核心共享的一致缓存。当它到达屏障时,它可以在让更多的内存操作进入其队列之前耗尽其内存操作队列。它不必耗尽其缓存 - 缓存一致性将处理其余部分。有关这些协议如何工作的详细说明,请参阅A Primer on Memory Consistency and Cache Coherence