草庐IT

c++ - 为什么 x86/x86_64 上的顺序语义通过 MOV [addr], reg + MFENCE 而不是 + SFENCE 使用?

在Intelx86/x86_64系统上有3种类型的内存屏障:lfence、sfence和mfence。关于它们的使用的问题。对于顺序语义(SC),对所有需要SC语义的存储单元使用MOV[addr],reg+MFENCE就足够了。但是,您可以编写整体代码,反之亦然:MFENCE+MOVreg,[addr]。显然感觉,如果存储到内存的数量通常少于从内存中加载的数量,那么使用写屏障的总成本就会更低。并且在此基础上,我们必须使用顺序存储到内存,进行了另一个优化-[LOCK]XCHG,由于“MFENCEinsideinXCHG”仅适用于内存中使用的缓存行,因此可能更便宜XCHG(videowhe

c++ - 为什么 GCC 不使用 LOAD(无围栏)和 STORE+SFENCE 来实现顺序一致性?

以下是在x86/x86_64中实现顺序一致性的四种方法:LOAD(不带围栏)和STORE+MFENCELOAD(无栅栏)和LOCKXCHGMFENCE+LOAD和STORE(无栅栏)LOCKXADD(0)和STORE(无栅栏)正如这里所写:http://www.cl.cam.ac.uk/~pes20/cpp/cpp0xmappings.htmlC/C++11Operationx86implementationLoadSeq_Cst:MOV(frommemory)StoreSeqCst:(LOCK)XCHG//alternative:MOV(intomemory),MFENCE注意:有一