第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請問如何在x86_64上加載/存儲原子雙浮點或SSE / AVX矢量

請問如何在x86_64上加載/存儲原子雙浮點或SSE / AVX矢量

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

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向量寄存器進行加載/存儲的原子性。



查看完整回答
反對 回復(fù) 2020-01-06
  • 2 回答
  • 0 關(guān)注
  • 477 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號