我发现x86 CPU有以下内存屏障说明:mfence
,lfence
和sfence
。
x86 CPU是否只有这三个内存屏障指令,还是有更多?
答案 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 Skylake,lock
ed指令阻止使用此代码https://godbolt.org/g/7Q9xgz对常规商店重新排序NT商店。
xchg
似乎是一个做seq-cst商店的好方法,特别是在像 Skylake这样的英特尔硬件上,其中mfence
也阻止了纯ALU指令的无序执行< / strong>,与lfence
类似:请参阅the bottom of this answer。
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(及其字符串副本版本in
和out
)是完整的内存障碍,也是部分序列化(如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