Performance x86锁与SFENCE/MFENCE

Performance x86锁与SFENCE/MFENCE,performance,assembly,optimization,x86,intel,Performance,Assembly,Optimization,X86,Intel,x86LOCK指令允许内核锁定系统总线,因此它可以专门修改内存(或者允许缓存一致性协议实现相同的功能)。但是,《英特尔开发人员手册》3A并未说明锁定刷新存储缓冲区 相反,SFENCE和MFENCE阻止重新排序和刷新存储缓冲区 那么什么时候需要使用LOCK和SFENCE/MFENCE LOCK是否与单个指令的原子性有关,而SFENCE/MFENCE是否与一系列指令有关?SFENCE只对常规存储排序NT存储,并且只最终刷新存储缓冲区,但不能在以后的加载可以执行之前。IDK为什么你会在这篇文章中提到它

x86
LOCK
指令允许内核锁定系统总线,因此它可以专门修改内存(或者允许缓存一致性协议实现相同的功能)。但是,《英特尔开发人员手册》3A并未说明
锁定
刷新存储缓冲区

相反,
SFENCE
MFENCE
阻止重新排序和刷新存储缓冲区

那么什么时候需要使用
LOCK
SFENCE
/
MFENCE


LOCK
是否与单个指令的原子性有关,而
SFENCE
/
MFENCE
是否与一系列指令有关?

SFENCE只对常规存储排序NT存储,并且只最终刷新存储缓冲区,但不能在以后的加载可以执行之前。IDK为什么你会在这篇文章中提到它,除了AMD CPU上(我认为)它的语义更像MFENCE。
lock
ed指令和
MFENCE
之间唯一可能的区别是它们是顺序NT存储(是)还是顺序弱的NT加载(在某些情况下,对于锁定,否)因此,一般来说,只有当你需要一个完整的屏障作为一些还不是原子RMW的东西的一部分时,你才使用mfence。如果你在做一个商店,那么使用
xchg
而不是
mov+mfence
会更有效。当然,即使使用一个虚拟的
lock add qword[rsp],0
而不是mfence。@PeterCordes考虑到内存屏障的强大,我只是不确定lock指令的意义是什么。哦,
lock
提供了原子RMW,同时也是一个完整的屏障。