使用Intel AVX存储来自打包双精度向量的单独双精度数

5

我正在使用Intel的AVX指令的C内置函数编写代码。如果我有一个打包的双精度向量(a __m256d),最有效的方法是什么(即操作次数最少),将它们存储到不同的内存位置(即我需要将它们扇出到不同的位置,使它们不再打包)? 伪代码:

__m256d *src;
double *dst;
int dst_dist;
dst[0] = src[0];
dst[dst_dist] = src[1];
dst[2 * dst_dist] = src[2];
dst[3 * dst_dist] = src[3];

使用SSE,我可以使用_mm_storel_pi和_mm_storeh_pi内部函数,使用__m128类型做到这一点。但是我没有找到类似的AVX方法来将64位数据存储到内存中。是否存在这样的方法?

我认为你想使用__m256d__m256是8个浮点数。 - Norbert P.
谢谢,我修复了。我错过它是因为我不使用__m256d;我实际上正在使用浮点数。我想要提取和存储的双精度数实际上是复数(两个浮点数,或一个双精度数的大小)。 - Jason R
1个回答

7
您可以使用一些提取指令来完成此操作:(警告:未经测试)
 __m256d src = ...  //  data

__m128d a = _mm256_extractf128_pd(src, 0);
__m128d b = _mm256_extractf128_pd(src, 1);

_mm_storel_pd(dst + 0*dst_dist, a);
_mm_storeh_pd(dst + 1*dst_dist, a);
_mm_storel_pd(dst + 2*dst_dist, b);
_mm_storeh_pd(dst + 3*dst_dist, b);

您需要的是AVX2中的聚集/散开指令...但这还需要几年的时间。

对于像我这样十年后才遇到这个问题的人,_mm256_stream_pd 可能是你真正需要的(请参见此处)。 - Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接