x86 CPU有多少个内存屏障指令?

时间:2018-05-14 04:59:16

标签: multithreading assembly x86 memory-barriers

我发现x86 CPU有以下内存屏障说明:mfencelfencesfence

x86 CPU是否只有这三个内存屏障指令,还是有更多?

2 个答案:

答案 0 :(得分:4)

sfence(SSE1)和mfence / lfence(SSE2)是唯一以其内存栅栏/屏障功能命名的指令。除非您使用NT加载或存储和/或WC内存,否则内存排序只需要mfence

(请注意,英特尔CPU上的lfence也是无序执行的障碍,因此它可以序列化rdtsc,并且对于幽灵缓解有用,可以防止推测性执行。在AMD上,必须设置MSR,否则lfence基本上是nop(4 /周期吞吐量)。该MSR是通过Spectre-mitigation微码更新引入的,通常由更新的内核。)

lock lock add [mem], eax等指令也是完全记忆障碍Does lock xchg have the same behavior as mfence?。 (虽然可能不如mfence那样强大,可以从WC内存中订购NT加载:Do locked instructions provide a barrier between weakly-ordered accesses?)。 xchg [mem], reg有一个隐含的lock前缀,因此它也是一个障碍。

In my testing on Skylakelock ed指令阻止使用此代码https://godbolt.org/g/7Q9xgz对常规商店重新排序NT商店。

xchg似乎是一个做seq-cst商店的好方法,特别是在像 Skylake这样的英特尔硬件上,其中mfence也阻止了纯ALU指令的无序执行< / strong>,与lfence类似:请参阅the bottom of this answer

AMD还建议使用xchg或其他锁定指令代替mfence。 (mfence在AMD手册中记录为序列化AMD,所以它总是会受到阻止OoO exec的惩罚。

对于没有SSE的32位目标的顺序一致性存储或完全障碍,编译器通常使用 lock or [esp], 0 或其他无操作锁定指令 记忆障碍效应。 std::atomic_thread_fence(std::memory_order_seq_cst);的{​​{3}}。

但无论如何,无论mfence还是lock ed insn 在架构上定义为在英特尔上进行序列化,,无论某些CPU上的实现细节如何。

cpuid这样的完整序列化指令也是完全内存屏障,耗尽了存储缓冲区以及刷新管道。 That's what g++7.3 -O3 -m32 -mno-sse does具有英特尔手册中的相关引用。

在Intel处理器上,以下是架构上的序列化指令(来自:Does lock xchg have the same behavior as mfence?):

  • 特权序列化指令 - INVD,INVEPT,INVLPG,INVVPID,LGDT,LIDT,LLDT,LTR,MOV控制寄存器,MOV(调试寄存器),WBINVD和WRMSR。

    例外:MOV CR8不是序列化。 WRMSR到IA32_TSC_DEADLINE MSR(MSR索引6E0H)和X2APIC MSR(MSR索引802H到83FH)没有序列化。

  • 非特权序列化说明 - CPUID,IRET 1 和RSM

在AMD处理器上,以下是架构上的序列化指令:

  • 特权序列化指令 - INVD,INVLPG,LGDT,LIDT,LLDT,LTR,MOV控制寄存器,MOV(调试寄存器),WBINVD,WRMSR和SWAPGS。

  • 非特权序列化说明 - MFENCE,CPUID,IRET和RSM

术语&#34; [完全]序列化指令&#34;英特尔处理器上的处理方式与AMD处理器完全相同,只有一个区别:来自CLFLUSH(但不是CLFLUSHOPT)的缓存行刷新操作仅针对后面的指令进行排序{{1}在AMD处理器上。

MFENCE / https://xem.github.io/minix86/manual/intel-x86-and-64-manual-vol3/o_fe12b1e2a880e0ce-273.html(及其字符串副本版本inout)是完整的内存障碍,也是部分序列化(如ins) 。文档说他们延迟执行下一条指令,直到&#34;数据阶段&#34; I / O交易。

脚注:

(1)根据BJ137(Sandy Bridge),HSD152(Haswell),BDM103(Broadwell):

  

问题:导致任务切换的IRET指令   从嵌套任务返回不会序列化处理器   (与软件开发人员手册第3卷标题相反   &#34;序列化说明&#34;)。

     

含义:取决于序列化的软件   任务切换期间IRET的属性可能不如   预期。英特尔没有观察到这个错误影响了   任何商业软件的运作。

     

解决方法:未确定。软件可以执行MFENCE   如果序列化,紧接在IRET指令之前的指令   需要。

答案 1 :(得分:0)

你是对的,x86 CPU上唯一的三个内存屏障功能是:

LFENCE

SFENCE

MFENCE