繁体   English   中英

将__m256d转换为__m256i

[英]Convert __m256d to __m256i

由于这样铸造:

 __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 ,从而避免了引起错误的强制转换。

但是在查看该列表之后 ,我找不到一个将参数__m256d值作为参数并返回__256i值的函数。 因此,也许您可​​以帮助我编写自己的函数或查找所需的函数,该函数将4x 64位双精度位值存储到4x64位整数数组中。

编辑:

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

我在这里还剩下什么?

您可以使用_mm256_store_pd( (double*)t, a) 我很确定这是严格混叠的安全性,因为您在投射指针后不会直接取消引用指针。 _mm256_store_pd内在函数使用任何必要的may-alias内容包装商店。

(使用AVX512,Intel切换为使用void*代替load 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, 1pextrq rax, xmm0, 1即可将FP位模式直接提取到整数寄存器中。 您可以使用内部函数手动编写此代码。 但是,存储/重新加载还不错,尤其是如果您希望将多个double位模式中的1个作为标量整数时。

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


这个强制转换编译为零个asm指令,即,它只是使C编译器感到满意的双关语

如果您想实际将double精度打包成最接近的有符号或无符号64位整数并将结果取为2的补码或无符号二进制而不是IEEE754 binary64,则需要AVX512F _mm256/512_cvtpd_epi64vcvtpd2qq )以使其高效。 SSE2 + x86-64可以实现标量处理,或者您可以将一些打包的FP hack用于[0..2^52]范围内的数字: 如何使用SSE / AVX有效执行double / int64转换?


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM