使用Intel AVX从打包的双向量存储单个双打

Jas*_*n R 5 x86 sse x86-64 avx

我正在使用C intrinsics为英特尔的AVX指令编写代码.如果我有一个打包的双向量(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];
Run Code Online (Sandbox Code Playgroud)

使用SSE,我可以__m128使用_mm_storel_pi_mm_storeh_piintrinsics 使用类型.我无法找到任何类似的AVX,允许我将各个64位存储器存储到内存中.有人存在吗?

Mys*_*ial 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);
Run Code Online (Sandbox Code Playgroud)

你想要的是AVX2中的收集/散射指令......但是这还需要几年的时间.