什么是非临时流加载内在函数(_mm256_stream_load_si256)的浮点(__m256d)版本?

时间:2017-07-04 08:28:52

标签: c++ x86 simd intrinsics avx2

在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);

1 个答案:

答案 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加载是在整数域中,所以你真的没有选择。

请注意,所有非临时指令(加载和存储)都需要对齐地址!