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

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

Susan Sarandon
發布: 2024-11-15 14:44:02
原創
917 人瀏覽過

When Should You Use _mm_sfence, _mm_lfence, and _mm_mfence?

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

多執行緒程式設計引入了與同時相關的複雜性,需要維護資料的機製完整性和同步性。 Intel 的內在函數庫提供了多個函數,包括 _mm_sfence、_mm_lfence 和 _mm_mfence,用於控制 x86 架構中的記憶體排序。

x86 中的記憶體排序

x86 CPU 具有很強的有序記憶體模型,但 C 和 C 的模型較弱。因此,需要採取額外的預防措施來確保正確的記憶體排序並防止資料損壞或競爭條件。

_mm_sfence

_mm_sfence 主要在非臨時 (NT) 儲存之後使用(_mm_stream_*) 以防止推測性重新排序。 NT 儲存是弱有序的,這意味著它們相對於其他記憶體操作可能出現無序發生。 _mm_sfence 建立一個屏障,確保 NT 儲存提交到記憶體後,後續記憶體操作變得全域可見。

_mm_lfence

_mm_lfence 很少被用作負載柵欄。它僅在從寫入組合 (WC) 記憶體區域(例如視訊 RAM)載入時才有意義。 _mm_lfence 可以阻止後續指令的執行,直到其退出,這對於微基準測試非常有用。

_mm_mfence

_mm_mfence 提供順序一致性,確保後續載入之前無法讀取值之前的商店變得全球可見。如果您實現自訂版本的 std::atomic 或需要明確控制可能是推測性的操作的記憶體排序,它會很有用。

摘要

  • 在 NT 儲存之後使用 _mm_sfence 來防止資料損壞和競爭條件。
  • 避免使用 _mm_lfence 進行載入排序,除非專門處理 WC 記憶體區域。
  • _mm_mfence 提供順序一致性,但效率可能低於鎖定原子讀-修改-寫入操作。
  • 考慮使用 C 11 std::atomic 或 C11 stdatomic 進行記憶體同步,因為它們提供了更方便和最佳化的方法。

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

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