簡體   English   中英

什么是非臨時流加載內在函數(_mm256_stream_load_si256)的浮點(__m256d)版本?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM