在這里(以及一些SO問題),我看到C ++不支持諸如無鎖之類的東西std::atomic<double>,還不支持諸如原子AVX / SSE矢量之類的東西,因為它依賴于CPU(盡管如今,我知道的CPU,ARM, AArch64和x86_64具有向量)。但是double在x86_64中對s或矢量的原子操作是否有匯編級支持?如果可以,支持哪些操作(例如加載,存儲,加,減,乘)?MSVC ++ 2017在哪些操作中實現了無鎖atomic<double>?
2 回答

海綿寶寶撒
TA貢獻1809條經驗 獲得超8個贊
在x86-64上,原子操作通過LOCK前綴實現。在英特爾軟件開發者手冊(第2卷,指令集)的狀態
LOCK前綴只能加在以下指令之前,并且只能加在目標操作數是存儲器操作數的那些形式的指令之前:ADD,ADC,AND,BTC,BTR,BTS,CMPXCHG,CMPXCH8B,CMPXCHG16B,DEC,INC, NEG,NOT,OR,SBB,SUB,XOR,XADD和XCHG。
這些指令均不對浮點寄存器(如XMM,YMM或FPU寄存器)進行操作。
這意味著沒有自然的方法可以在x86-64上實現原子的float / double操作。雖然大多數這些操作都可以通過將浮點值的位表示形式加載到通用(即整數)寄存器中來實現,但這樣做會嚴重降低性能,因此編譯器作者選擇不實現它。
正如Peter Cordes在評論中所指出的,加載和存儲不需要LOCK前綴,因為在x86-64上,它們始終是原子的。但是,Intel SDM(第3卷,系統編程指南)僅保證以下加載/存儲是原子的:
讀取或寫入單個字節的指令。
讀或寫一個字(2個字節)的指令,其地址在2個字節的邊界上對齊。
讀或寫雙字(4個字節)的指令,其地址在4字節邊界上對齊。
讀或寫地址為8字節邊界對齊的四字(8字節)的指令。
特別是不能保證從較大的XMM和YMM向量寄存器進行加載/存儲的原子性。
- 2 回答
- 0 關注
- 473 瀏覽
添加回答
舉報
0/150
提交
取消