首頁 > 後端開發 > C++ > x86_64 是否支援雙精度和 SSE/AVX 向量上的原子操作?

x86_64 是否支援雙精度和 SSE/AVX 向量上的原子操作?

Mary-Kate Olsen
發布: 2024-11-27 06:58:10
原創
1037 人瀏覽過

Does x86_64 Support Atomic Operations on Doubles and SSE/AVX Vectors?

x86_64 上的原子浮點運算和SSE/AVX 向量載入/儲存

雖然C 11 支援無鎖定std::atomic,但它確實確實支援由於CPU 依賴性,目前不支援原子AVX/SSE 向量。然而,問題出現了:x86_64 是否為雙精度或向量上的原子操作提供彙編級支援?

x86_64 上的原子操作

x86_64 支援以下對雙精度的原子操作,使用鎖執行-自由的說明:

  • 載入
  • 儲存

原子向量運算x86_64

不幸的是,無法保證128b 或 256b 向量在快取一致性系統中儲存或載入的原子性。但是,對於對齊向量,您可以安全地在共享雙精度數組上使用向量加載和存儲,而無需擔心撕裂的風險。

如果需要原子 16B 加載,則唯一的選擇是使用帶有desired=expected 的鎖 cmpxchg16b。如果成功,它將用自身取代現有值。如果失敗,您將獲得舊內容。請注意,此「載入」會在唯讀記憶體上出現錯誤,因此在將指標傳遞給執行此操作的函數時請小心。

原子 16B 儲存和 RMW 都可以以明顯的方式使用鎖定 cmpxchg16b。這使得純儲存比常規向量儲存昂貴得多,尤其是在多次重試 cmpxchg16b 的情況下。然而,原子 RMW 已經很昂貴了。

原子向量運算的限制

  • 原子<__m128d>由於使用 cmpxchg16b,即使對於只讀或只寫操作也會很慢。
  • atomic<__m256d>不能是無鎖的。
  • alignas(64)atomic共享緩衝區[1024];將允許自動向量化,但編譯器不會為此產生有效的 asm。

原子讀取和更新 16B 對象

您可以原子更新 16B 對象,但單獨讀取 8B 一半。然而,編譯器並沒有提供一種乾淨的方式來表達這一點,並且由於編譯器開發人員不斷的考慮,內聯 cmpxchg16b 是不可靠的。

以上是x86_64 是否支援雙精度和 SSE/AVX 向量上的原子操作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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