首頁 > 後端開發 > C++ > 主體

什麼時候應該使用 _mm_sfence、_mm_lfence 或 _mm_mfence?

Patricia Arquette
發布: 2024-11-18 00:05:02
原創
385 人瀏覽過

When Should You Use _mm_sfence, _mm_lfence, or _mm_mfence?

決定何時使用 _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:

  • NTence:
NT儲存的理想選擇,在設定其他理想下線程依賴的標誌之前需要一個柵欄。

確保使用NT 儲存時釋放/取得同步,與常規儲存不同,NT 儲存是弱排序的

  • _mm_lfence:
很少用作負載柵欄,因為在涉及WC(寫入組合)記憶體時負載僅弱排序區域。

可用於控制某些處理器上的執行流程,防止稍後的指令執行,直到lfence 已完成。

  • _mm_mfence:
對於實現您自己的 std::atomic 版本可能有用,請利用 mfence 實現順序一致性。

注意:mfence 可能比鎖定的atomic-RMW 慢

有關性能的注意事項

重要的是要認識到圍欄不會提高商店的可見度。它們只是推遲當前執行緒內的操作,直到前面的操作完成為止。

結論對於一般用例,C 11 std::atomic 或 C11 stdatomic 提供強大的功能以及用於控制記憶體排序的用戶友好解決方案。在涉及 NT 儲存或 std::atomic 自訂實作的場景中,_mm_sfence 和 _mm_mfence 可能很有價值,但仔細考慮它們對效能的影響至關重要。

以上是什麼時候應該使用 _mm_sfence、_mm_lfence 或 _mm_mfence?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板