5

我正在为英特尔的 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,我可以使用使用和内在函数的__m128类型来做到这一点。我还没有找到任何与 AVX 类似的东西,可以让我将单独的 64 位片段存储到内存中。一个存在吗?_mm_storel_pi_mm_storeh_pi

4

1 回答 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 中的收集/分散指令......但这仍然需要几年的时间。

于 2011-12-09T04:15:05.747 回答