似乎 "Acquire" 和 "Release" 语义的公认定义是这样的:
(摘自 http://msdn.microsoft.com/en-us/library/windows/hardware/ff540496(v=vs.85).aspx)
一个操作具有“acquire”语义,如果其他处理器在任何后续操作之前总是看到它的效果。一个操作具有“release”语义,如果其他处理器在其自身生效之前看到每个先前操作的效果。
我简要阅读了存在一半内存屏障的例子,据说它们呈现“acquire barriers”和“release barriers”的形式,遵循上述相同的语义。
在查找实际硬件指令的示例时,我遇到了 SFENCE。而这篇博客 (http://peeterjoot.wordpress.com/2009/12/04/intel-memory-ordering-fence-instructions-and-atomic-operations/) 表示,它是释放式屏障/障碍的一种形式:
Intel 提供了双向屏障指令 MFENCE,acquire 屏障指令 LFENCE 和 release 屏障指令 SFENCE。
然而,阅读 SFENCE 的定义,它似乎并未提供 release 语义,因为它根本不与 load 同步?而我理解的“release”语义是相对于所有内存操作(load 和 store)的顺序定义。
一个操作具有“acquire”语义,如果其他处理器在任何后续操作之前总是看到它的效果。一个操作具有“release”语义,如果其他处理器在其自身生效之前看到每个先前操作的效果。
我简要阅读了存在一半内存屏障的例子,据说它们呈现“acquire barriers”和“release barriers”的形式,遵循上述相同的语义。
在查找实际硬件指令的示例时,我遇到了 SFENCE。而这篇博客 (http://peeterjoot.wordpress.com/2009/12/04/intel-memory-ordering-fence-instructions-and-atomic-operations/) 表示,它是释放式屏障/障碍的一种形式:
Intel 提供了双向屏障指令 MFENCE,acquire 屏障指令 LFENCE 和 release 屏障指令 SFENCE。
然而,阅读 SFENCE 的定义,它似乎并未提供 release 语义,因为它根本不与 load 同步?而我理解的“release”语义是相对于所有内存操作(load 和 store)的顺序定义。
membar #LoadLoad | #LoadStore
(用于获取)和membar #LoadStore | #StoreStore
(用于释放)。虽然获取和释放语义应该与任何内存操作相关才能有用,但这并不意味着这样的屏障没有任何用处。 - minmaxavg