gpt4 book ai didi

c++ - 什么是非时间流加载固有 (_mm256_stream_load_si256) 的浮点 (__m256d) 版本?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:34:27 29 4
gpt4 key购买 nike

在 AVX/AVX2 中我只能找到 _mm256_stream_load_si256() ,用于 __m256i。没有办法流式加载 __m256d 吗?为什么? (我想在不污染 CPU 缓存的情况下加载它)

做下面的(aggressive casting)有什么障碍吗?

__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 instruction .这是唯一非时间加载指令,所以这是您必须使用的指令,即使您正在加载 float 据。

(其他三个非时间指令只做存储:(V)MOVNTDQ(_mm256_stream_si256)用于双四字整数,(V)MOVNTPS(_mm256_stream_ps)用于压缩单精度浮点值,(V)MOVNTPD(_mm256_stream_pd)用于压缩 double 浮点值。)

__m256i*__m256d* 的强制转换,反之亦然,是安全的。这些只是位,它们都存储在 YMM 寄存器中。我从未见过编译器在处理这些类型的转换时遇到问题。不过,可能应该检查生成的汇编代码以确保它没有做一些奇怪的事情!

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

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

关于c++ - 什么是非时间流加载固有 (_mm256_stream_load_si256) 的浮点 (__m256d) 版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44900815/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com