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

儘管存在 C 限制,如何在 x86_64 上實現雙精度和向量的原子操作?

Patricia Arquette
發布: 2024-11-28 06:06:19
原創
358 人瀏覽過

How Can Atomic Operations on Doubles and Vectors Be Achieved on x86_64 Despite C   Limitations?

儘管 C 的 std::atomic 存在限制,缺乏無鎖支持,但 x86_64 為雙精度和向量上的某些原子操作提供了彙編級支持。

原子雙操作x86_64

  • 自然對齊的載入和儲存(最多 8 個位元組)是原子的。
  • 原子讀取-修改-寫入操作(RMW) 需要使用cmpxchg 進行重試循環.
  • cmpxchg16b 可用於16 位元組原子加載,

x86_64 上的SSE/AVX向量操作

雖然 C 目前缺乏對原子 AVX/SSE 向量操作的支持,但沒有辦法保證 128b 或 256b 緩存行在整個緩存中的原子傳輸系統。

但是,在對齊雙精確度的共用陣列上使用向量載入/儲存時,可以採取某些預防措施來最大程度地降低撕裂風險。

原子 16B 載入

  • 使用lock cmpxchg16b 和desired=expected 可以提供原子16B 載入。

原子 16B 儲存和 RMW

  • 鎖定 cmpxchg16b 可用於原子 16B 儲存和 RMW 操作。

原子操作具有 8B 半部的 16B 物件

  • 可以在獨立讀取 8B 半部的同時原子地更新 16B 物件。

編譯器和原子操作

編譯器可能不會總是產生最優的原子操作的組譯程式碼。例如,他們可能會避免在 XMM 和雙寄存器之間直接進行 movsd 加載/存儲,而是選擇迂迴方法。

以上是儘管存在 C 限制,如何在 x86_64 上實現雙精度和向量的原子操作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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