」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 為什麼 `std::atomic` 的儲存使用 XCHG 來實現 x86 上的順序一致性?

為什麼 `std::atomic` 的儲存使用 XCHG 來實現 x86 上的順序一致性?

發佈於2024-11-18
瀏覽:389

Why does `std::atomic`\'s store use XCHG for sequential consistency on x86?

為什麼std::atomic 的儲存採用XCHG 來實現順序一致性

在x86 和x86_64 架構的std::atomic 上下文中,a具有​​順序一致性的儲存操作(std::memory_order_seq_cst) 使用XCHG而不是具有內存屏障的簡單存儲作為實現順序釋放語義的技術。

順序一致性和 xchg

順序一致性規定所有記憶體操作似乎都按某種順序執行,並且該順序對於所有執行緒都是相同的。 XCHG 是一種以原子方式交換兩個操作數的值的 x86 指令,本質上滿足了這種順序一致性要求。透過使用 XCHG 執行寫入操作,std::atomic 確保儲存在執行順序的特定點對所有執行緒全域可見,從而防止後續操作重新排序。

mov- store mfence 與XCHG

雖然簡單的mov-store 後跟內存柵欄(例如mfence)理論上可以提供釋放語義,但對於順序釋放存儲操作來說還不夠。 MFENCE 是建立記憶體屏障的記憶體柵欄指令,可確保先前的寫入作業在繼續之前提交到記憶體。但是,它不會阻止後續載入操作在發布儲存體之前重新排序。

效能注意事項

順序發布的 mov-store mfence 和 XCHG 之間的選擇儲存作業涉及效能權衡。

  • 在某些CPU(例如Intel Skylake)上,XCHG 比mov-store mfence 更有效率,尤其是當周圍沒有需要同步的依賴程式碼時
  • 在其他CPU 上,mov-store mfence 可能更適合高吞吐量場景或當周圍程式碼可以與原子運算重疊執行時。

實作細節

實際中,std::atomic的順序一致性儲存的具體實作根據編譯器和硬體架構的不同而有所不同。

  • GCC/ Clang: 最初使用 mov-store mfence,但最近改用 XCHG 進行 seq-cst 儲存。
  • Intel 編譯器: 使用 XCHG 進行 seq-cst 儲存。
  • Microsoft Visual C : 也使用 XCHG 進行 seq-cst 儲存。

隱式獲取柵欄

x86 的聲明商店有一個隱式的獲取柵欄是不正確的。 x86 上的儲存具有釋放語義,而不是獲取語義。獲取語義通常使用記憶體屏障(例如 mfence)或帶有 std::memory_order_acquire 語義的原子讀取操作來強制執行。

最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3