X86 使用Intel AVX存储压缩双精度向量中的单个双精度

X86 使用Intel AVX存储压缩双精度向量中的单个双精度,x86,x86-64,sse,avx,X86,X86 64,Sse,Avx,我正在为英特尔的AVX指令使用C内部函数编写代码。如果我有一个压缩双向量(a\uuuu 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]

我正在为英特尔的AVX指令使用C内部函数编写代码。如果我有一个压缩双向量(a
\uuuu 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,我可以使用
\u mm\u storel\u pi
\u mm\u storeh\u pi
内部函数对
\u m128
类型执行此操作。我还没有找到任何类似的AVX,它允许我将单个的64位片段存储到内存中。是否存在一个?

您可以使用两个extract instrinsics进行操作:(警告:未测试)


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

我想你应该使用
\uuuum256d
<代码>是8个浮点数。谢谢,我修正了。我错过了它,因为我没有使用
\uuuuum256d
;我实际上是在用彩车。我要提取和存储的双精度数实际上是复数(两个浮点数,或一个双精度数的大小)。这正是我需要的。谢谢
 __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);