2017-07-04 61 views
3

在AVX/AVX2中,我只能找到_mm256_stream_load_si256(),这是__m256i。有没有办法流式加载__m256d,为什么? (我想加载它没有污染CPU缓存)什么是非时间流媒体加载内在(_mm256_stream_load_si256)的浮点(__m256d)版本?

是否有任何障碍做下列(积极铸造)?

__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

__m256d和__m256i有什么区别? –

+0

@MarekVitek,'__m256d'包含4个“双”。 '__m256i'包含32 uint8_t' /'int8_t',16'uint16_t' /'int16_t',8'uint32_t' /'int32_t'和4'uint64_t' /'int64_t'的联合。所以它们都是32字节长,占用1个YMM寄存器。 –

回答

5

_mm256_stream_load_si256()内在对应于(V)MOVNTDQA instruction。这是只有非暂时性加载指令,所以即使您正在加载浮点数据,这也是您要使用的的一个。

(其他三个非时间说明仅做存储(V)MOVNTDQ_mm256_stream_si256)为双四字整数,(V)MOVNTPS_mm256_stream_ps)是用于打包单精度浮点值,和(V)MOVNTPD_mm256_stream_pd)是用于打包的双精度浮点值)。

__m256i*__m256d*的演员阵容,反之亦然,是安全的。这些只是位,并且它们都存储在YMM寄存器中。我从来没有见过编译器在这些类型的转换中遇到麻烦。虽然可能应该检查生成的汇编代码,以确保它没有做一些奇怪的事情!

唯一重要的是在某些处理器上,当您将浮点SIMD指令与整数SIMD指令混合使用时,会出现域交叉惩罚。但是由于唯一的NT负载在整数域中,所以你在这里没有选择。

注意所有非临时指令(加载和存储)要求对准地址!