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

Ser*_*tch 5 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);
Run Code Online (Sandbox Code Playgroud)

Cod*_*ray 6

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

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