我正在使用C内在函数编写英特尔AVX指令的代码。如果我有一个打包的双矢量(__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
和_mm_storel_pi
内部函数对_mm_storeh_pi
类型进行此操作。我无法找到与AVX类似的任何东西,从而无法将单个64位片段存储到内存中。是否存在?
最佳答案
您可以使用一些提取的指令来做到这一点:(警告:未经测试)
__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中的收集/散布说明...但这还需要几年的时间。
关于x86 - 使用Intel AVX从压缩 double 向量存储单个 double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8440793/