決定何時使用 _mm_sfence、_mm_lfence 或 _mm_mfence
使用多執行緒程式碼時,需要有效地控制記憶體排序。雖然 x86 處理器擁有嚴格有序的記憶體模型,但 C 和 C 遵循更寬鬆的模型。這可能會導致關於正確使用內在函數 _mm_sfence、_mm_lfence 和 _mm_mfence 的混亂。
理解記憶體排序
用於獲取/釋放語義,防止編譯時重新排序正如編譯器屏障概念所強調的那樣,僅此一項就足夠了。這確保了抽象機中操作的正確順序,而不會因不必要的彙編指令而影響效能。 GNU C/C asm("" ::: "memory") 等選項有效地充當編譯器障礙,實現這一目標,同時最大限度地減少效能影響。
或者,C 11 std::atomic 提供了一個無縫解決方案shared_var.store(tmp, std::memory_order_release),確保更改的全域可見性。如果您正在實現自己的 C11/C 11 std::atomic 版本,利用 mfence 建立順序一致性並防止後續加載在前面的存儲變得全局可訪問之前獲取值,則 _mm_mfence 具有潛在價值。
檢查每個人的角色內在
_mm_sfence:
確保使用NT 儲存時釋放/取得同步,與常規儲存不同,NT 儲存是弱排序的
可用於控制某些處理器上的執行流程,防止稍後的指令執行,直到lfence 已完成。
注意:mfence 可能比鎖定的atomic-RMW 慢
有關性能的注意事項重要的是要認識到圍欄不會提高商店的可見度。它們只是推遲當前執行緒內的操作,直到前面的操作完成為止。
結論對於一般用例,C 11 std::atomic 或 C11 stdatomic 提供強大的功能以及用於控制記憶體排序的用戶友好解決方案。在涉及 NT 儲存或 std::atomic 自訂實作的場景中,_mm_sfence 和 _mm_mfence 可能很有價值,但仔細考慮它們對效能的影響至關重要。以上是什麼時候應該使用 _mm_sfence、_mm_lfence 或 _mm_mfence?的詳細內容。更多資訊請關注PHP中文網其他相關文章!