【问题标题】:Storing individual doubles from a packed double vector using Intel AVX使用英特尔 AVX 存储压缩双精度向量中的单个双精度
【发布时间】:2023-04-08 22:28:01
【问题描述】:

我正在为英特尔的 AVX 指令使用 C 内部函数编写代码。如果我有一个打包的双向量(__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,我可以使用 _mm_storel_pi_mm_storeh_pi 内在函数对 __m128 类型执行此操作。我无法找到任何与 AVX 类似的东西,可以让我将单个 64 位片段存储到内存中。有吗?

【问题讨论】:

  • 我想你想使用__m256d__m256 是 8 个浮点数。
  • 谢谢,我修好了。我错过了,因为我不使用__m256d;我实际上正在使用花车。我要提取和存储的双精度数实际上是复数(两个浮点数,或一个双精度数的大小)。

标签: x86 x86-64 sse avx


【解决方案1】:

你可以用几个提取内在函数来做到这一点:(警告:未经测试)

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

【讨论】:

  • 这正是我所需要的。谢谢!
  • 对于像我这样在十年后偶然发现这一点的人来说,_mm256_stream_pd 可能是您想要的(参见here)。
猜你喜欢
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2015-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-05
  • 2016-08-17
相关资源
最近更新 更多