2 回答

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