【问题标题】:Convert __m256d to __m256i将 __m256d 转换为 __m256i
【发布时间】:2018-06-24 16:17:27
【问题描述】:

既然这样投:

 __m256d a;

uint64_t t[4];

_mm256_store_si256( (__m256i*)t, (__m256i)a );/* Cast of 'a' to __m256i not allowed */

在 Visual Studio 下编译时不允许使用,我想我可以使用一些内在函数将 __m256d 值转换为 __m256i,然后再将其传递给 _mm256_store_si256,从而避免导致错误的强制转换.

但是在查看that list 之后,我找不到一个函数以 __m256d 值作为参数并返回 __256i 值。所以也许你可以帮助我编写自己的函数或找到我正在寻找的函数,一个将 4x 64 位双位值存储到 4x64 位整数数组的函数。

编辑:

经过进一步研究,我发现 _mm256_cvtpd_epi64 这似乎正是我想要的。但是,我的 CPU 不支持 AVX512 指令集...

我在这里做什么?

【问题讨论】:

  • @PaulR:我 认为 OP 想要将 4x 64 位 double 位模式存储到 64 位整数数组中,无需 double->int 转换.
  • 使用 srtuct 代替 Intel 特定的内在类型怎么样?
  • double->int转换没问题,没关系
  • @PeterCordes:是的,你可能是对的——问题不是很清楚。
  • @Biswapriyo 使用结构是什么意思?

标签: c type-conversion intrinsics


【解决方案1】:

您可以使用 _mm256_store_pd( (double*)t, a)。我很确定这是严格混叠安全的,因为您在转换后没有直接取消引用指针。 _mm256_store_pd 内在函数用任何必要的可能别名的东西包装了商店。

(在 AVX512 中,英特尔切换到使用 void* 作为加载/存储内在函数,而不是 float*double*__m512i*,以消除对这些笨重的强制转换的需求,并使内在函数更加清晰可以给任何东西起别名。)

另一个选项是_mm256_castpd_si256__m256d 的位重新解释为__m256i

alignas(32) uint64_t t[4];
_mm256_store_si256( (__m256i*)t,  _mm256_castpd_si256(a));

如果您立即从t[] 读取数据,您的编译器可能会优化存储/重新加载并只是随机播放或pextrq rax, xmm0, 1 以将FP 位模式直接提取到整数寄存器中。您可以使用内在函数手动编写它。不过,存储/重新加载也不错,尤其是当您希望将超过 1 个 double 位模式作为标量整数时。

可以改用union m256_elements { uint64_t u64[4]; __m256d vecd; };,但不能保证编译效率高。


这个转换编译为零 asm 指令,即它只是一个让 C 编译器满意的类型双关语

如果您想将压缩后的 double 实际舍入为最接近的有符号或无符号 64 位整数,并以 2 的补码或无符号二进制而不是 IEEE754 binary64 的形式得到结果,则需要 AVX512F _mm256/512_cvtpd_epi64 (vcvtpd2qq)它是有效的。 SSE2 + x86-64 可以用于标量,或者您可以使用一些打包的 FP hack 来处理 [0..2^52] 范围内的数字:How to efficiently perform double/int64 conversions with SSE/AVX?


顺便说一句,storeu 不需要对齐的目标,但 store 需要。如果目标是本地的,您通常应该对齐它而不是使用未对齐的存储,至少如果存储发生在循环中,或者如果此函数可以内联到更大的函数中。

【讨论】:

  • _mm256_castpd_si256 似乎可以完成这项工作。谢谢
  • @TomClabault:哦,所以对您的问题的编辑是错误的,您不想想用_mm256_cvtpd_epi64 或非AVX512 等效项转换为整数?您只想将double 位模式键入到uint64_t?如果是,我将撤消重复关闭。
  • 是的,这不是转换,而是从 double 到 int 的类型双关
猜你喜欢
  • 1970-01-01
  • 2020-05-21
  • 2019-11-05
  • 2015-06-13
  • 2019-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多