2017-07-04 89 views
3

在AVX/AVX2中,我只能找到_mm256_stream_load_si256(),這是__m256i。有沒有辦法流式加載__m256d,爲什麼? (我想加載它沒有污染CPU緩存)什麼是非時間流媒體加載內在(_mm256_stream_load_si256)的浮點(__m256d)版本?

是否有任何障礙做下列(積極鑄造)?

__m256d *pDest = /* ... */; 
__m256d *pSrc = /* ... */; 

/* ... */ 

const __m256i iWeight = _mm256_stream_load_si256(reinterpret_cast<const __m256i*>(pSrc)); 
const __m256d prior = _mm256_div_pd(*reinterpret_cast<const __m256d*>(&iWeight), divisor); 
_mm256_stream_pd(reinterpret_cast<double*>(pDest), prior); 
+0

__m256d和__m256i有什麼區別? –

+0

@MarekVitek,'__m256d'包含4個「雙」。 '__m256i'包含32 uint8_t' /'int8_t',16'uint16_t' /'int16_t',8'uint32_t' /'int32_t'和4'uint64_t' /'int64_t'的聯合。所以它們都是32字節長,佔用1個YMM寄存器。 –

回答

5

_mm256_stream_load_si256()內在對應於(V)MOVNTDQA instruction。這是只有非暫時性加載指令,所以即使您正在加載浮點數據,這也是您要使用的的一個。

(其他三個非時間說明僅做存儲(V)MOVNTDQ_mm256_stream_si256)爲雙四字整數,(V)MOVNTPS_mm256_stream_ps)是用於打包單精度浮點值,和(V)MOVNTPD_mm256_stream_pd)是用於打包的雙精度浮點值)。

__m256i*__m256d*的演員陣容,反之亦然,是安全的。這些只是位,並且它們都存儲在YMM寄存器中。我從來沒有見過編譯器在這些類型的轉換中遇到麻煩。雖然可能應該檢查生成的彙編代碼,以確保它沒有做一些奇怪的事情!

唯一重要的是在某些處理器上,當您將浮點SIMD指令與整數SIMD指令混合使用時,會出現域交叉懲罰。但是由於唯一的NT負載在整數域中,所以你在這裏沒有選擇。

注意所有非臨時指令(加載和存儲)要求對準地址!