x86 - 使用Intel AVX从压缩 double 向量存储单个 double

标签 x86 x86-64 sse avx

我正在使用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/

相关文章:

x86 - 为什么保留x86 CR1控制寄存器?

c - gcc内联汇编错误

c++ - 将 __m256 的奇数元素提取到 __m128 中的有效(在 Ryzen 上)方法?

linux - NASM:两个后续文件写入不起作用

assembly - 如何将寄存器中的VALUE移至NASM中的存储变量?

assembly - 为什么调用和跳转指令使用相对于下一条指令的位移,而不是当前指令的位移?

operating-system - 直接连接到 CPU 的 PCIe 插槽的中断路由

c++ - SSE微优化指令顺序

c++ - -O3 打开时 SSE 中的段错误

c - 使用 SSE vector 指令加速矩阵-矩阵乘法