在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);
答案 0 :(得分:6)
_mm256_stream_load_si256()
内在对应于(V)MOVNTDQA
instruction。这是仅非临时加载指令,因此即使在加载浮点数据时,这也是 要使用的指令。
(其他三个非时间指令仅执行商店:(V)MOVNTDQ
(_mm256_stream_si256
)用于双四字整数,(V)MOVNTPS
({{3} })用于打包的单精度浮点值,_mm256_stream_ps
((V)MOVNTPD
)用于打包的双精度浮点值。)
从__m256i*
到__m256d*
的演员阵容,反之亦然,是安全的。这些只是位,它们都存储在YMM
寄存器中。我从来没有见过编译器在这些类型的演员表上遇到麻烦。可能应该检查生成的汇编代码,以确保它没有做一些时髦的事情!
唯一重要的是在某些处理器上,当您将浮点SIMD指令与整数SIMD指令混合时会出现域交叉惩罚。但由于唯一的NT加载是在整数域中,所以你真的没有选择。
请注意,所有非临时指令(加载和存储)都需要对齐地址!