什麼時候應該使用 _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 或需要明確控制可能是推測性的操作的記憶體排序,它會很有用。
摘要
以上是什麼時候應該使用 _mm_sfence、_mm_lfence 和 _mm_mfence?的詳細內容。更多資訊請關注PHP中文網其他相關文章!