雖然C 11 支援無鎖定std::atomic
x86_64 支援以下對雙精度的原子操作,使用鎖執行-自由的說明:
不幸的是,無法保證128b 或 256b 向量在快取一致性系統中儲存或載入的原子性。但是,對於對齊向量,您可以安全地在共享雙精度數組上使用向量加載和存儲,而無需擔心撕裂的風險。
如果需要原子 16B 加載,則唯一的選擇是使用帶有desired=expected 的鎖 cmpxchg16b。如果成功,它將用自身取代現有值。如果失敗,您將獲得舊內容。請注意,此「載入」會在唯讀記憶體上出現錯誤,因此在將指標傳遞給執行此操作的函數時請小心。
原子 16B 儲存和 RMW 都可以以明顯的方式使用鎖定 cmpxchg16b。這使得純儲存比常規向量儲存昂貴得多,尤其是在多次重試 cmpxchg16b 的情況下。然而,原子 RMW 已經很昂貴了。
您可以原子更新 16B 對象,但單獨讀取 8B 一半。然而,編譯器並沒有提供一種乾淨的方式來表達這一點,並且由於編譯器開發人員不斷的考慮,內聯 cmpxchg16b 是不可靠的。
以上是x86_64 是否支援雙精度和 SSE/AVX 向量上的原子操作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!