首頁 >後端開發 >C++ >x86_64 架構上如何處理原子浮點和向量運算?

x86_64 架構上如何處理原子浮點和向量運算?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-07 06:08:15483瀏覽

How are Atomic Floating-Point and Vector Operations Handled on x86_64 Architectures?

x86_64 上的原子浮點運算

雖然C 本身不支援原子雙精確度運算,但它確實提供無鎖原子 操作。大多數平台上的實作。這些實作通常使用鎖定 cmpxchg 指令的比較和交換 (CAS) 操作。

對於 x86_64 上的原子向量操作,沒有直接的硬體支援。然而,對齊的 128 位元和 256 位元載入和儲存通常保證是原子的。對於非對齊向量操作,原子性保證不太明確。

對雙精度和向量操作的彙編級支援

x86_64 為原子操作提供彙編級支援雙打和向量:

  • 雙精確度: 透過記憶體目標指令movsd、movq、addsd、subsd和 mulsd 支援原子載入、儲存和加/減/乘操作。
  • 向量:對齊128 位元和 256 位元載入和儲存在具有 AVX 支援的 x86_64 上是原子的。對於非對齊向量操作,沒有直接的原子性硬體保證。

MSVC 2017 實作無鎖原子

MSVC 2017實作無鎖原子使用雙寬度整數暫存器進行操作。例如,載入操作涉及:

CAS: movq QWORD PTR [dst_addr], rax  // 64-bit CAS

新增操作使用:

CAS: lock cmpxchg16b QWORD PTR [dst_addr], rax  // 128-bit CAS

原子RMW(讀取-修改-寫入)操作

原子讀-修改-寫(RMW) 操作,例如fetch_add,需要CAS 循環實作。在 x86_64 上,CAS 指令支援 16 位元組操作 (cmpxchg16b)。

CAS: lock cmpxchg16b QWORD PTR [dst_addr], rax

雖然 CAS 循環提供原子 RMW 功能,但它們比原子加載和儲存更昂貴。

附加說明

  • 一些非 x86 硬體支援 float/double 類型的原子加法操作。
  • Intel 的事務記憶體擴充 (TSX) 改進了對原子 FP 和 SIMD 操作的支援。
  • 編譯器通常會產生低效的原子碼< ;雙>操作,但正在改進。
  • 對對齊雙精度數共享數組的原子操作應該是安全的,而對未對齊向量的操作可能涉及撕裂。
  • 可以在 16 上實作原子操作-byte 物件使用 cmpxchg16b,但效能會很差。

以上是x86_64 架構上如何處理原子浮點和向量運算?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn