[英]What is the floating-point (__m256d) version of the non-temporal streaming load intrinsic (_mm256_stream_load_si256)?
在AVX / AVX2中,我只能找到_mm256_stream_load_si256()
,這是__m256i
。 有沒有辦法流加載__m256d
,為什么? (我想在不污染CPU緩存的情況下加載它)
進行以下操作是否存在任何障礙(侵略性鑄造)?
__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);
_mm256_stream_load_si256()
內在對應於(V)MOVNTDQA
指令 。 這是唯一的非臨時加載指令,因此即使在加載浮點數據時也必須使用此指令。
(其他三個非時間指令僅存儲 : (V)MOVNTDQ
( _mm256_stream_si256
)用於雙四字整數, (V)MOVNTPS
( _mm256_stream_ps
)用於打包單精度浮點值, (V)MOVNTPD
( _mm256_stream_pd
)用於打包的雙精度浮點值。)
從__m256i*
到__m256d*
,反之亦然,是安全的。 這些只是位,它們都存儲在YMM
寄存器中。 我從未見過編譯器在這些類型的轉換中遇到問題。 可能應該檢查生成的匯編代碼,以確保它沒有做一些時髦的事情!
唯一重要的是在某些處理器上,當您將浮點SIMD指令與整數SIMD指令混合時會出現域交叉損失。 但由於唯一的NT加載是在整數域中,所以你真的沒有選擇。
請注意, 所有非時間指令(加載和存儲)都需要對齊的地址!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.