反转 __m512i 寄存器中的值

Posted

技术标签:

【中文标题】反转 __m512i 寄存器中的值【英文标题】:Reverse the values in a __m512i register 【发布时间】:2018-02-26 10:53:11 【问题描述】:

我想颠倒__m512i 寄存器中所有值的顺序。 我的主要问题是我没有找到关于如何使用所有不同的随机播放操作的解释。我已经尝试过_mm512_shuffle_epi32,但我没有找到任何解释_MM_PERM_AAAA_MM_PERM_AAAB、...实际上是如何工作的,只是尝试它们我不知道如何使用它们。

【问题讨论】:

您是否尝试过阅读这些内在函数的参考页面? 元素的大小是多少? 【参考方案1】:

找到解决办法:

const __m512i reverseMask = _mm512_set_epi32 (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
__m512i reversed = _mm512_permutevar_epi32(reverseMask,ObjectToReverse); 

请注意,“reverseMask”不是真正的掩码,而是一个寄存器,用于保存寄存器中要反转的每个对象的位置。

【讨论】:

这只反转/随机播放 32 位字。它不会反转单词中的字节。另请参阅英特尔内部指南中的 _mm512_shuffle_epi32 是的,vpermdvpermq 是最好的方法。如果您需要比这更精细的粒度,AVX512BW 有vpermw,AVX512VBMI 有vpermb。如果没有这些,请使用vpermq,然后在 16 字节通道内使用vpshufb 反转。 @jww:_mm512_shuffle_epi32 (vpshufd) 是通道内随机播放。它对此没有用,因为即使是 AVX512F 也具有相同元素大小的车道交叉洗牌。 实际上,vshufi64x2 zmm, same,same, imm8 可以通过立即控制操作数完成车道交叉,以 128 位粒度进行混洗,但在 KNL(2 源混洗)上比 vpermd/q 慢。当然,vpshufb zmm 是 AVX512BW,无论如何都不能在 KNL 上使用。

以上是关于反转 __m512i 寄存器中的值的主要内容,如果未能解决你的问题,请参考以下文章

C++ SSE 命令反转寄存器值

有没有办法根据编译时未知的掩码长度来掩码 __m128i 寄存器的一端?

将 __m128i 中的每个 DW 右移不同的量

矢量化:乘 _m256i 元素

如何在 SSE 中使用 imm8?

使用 AVX/AVX2/SSE __m128i 将所有负数字节设置为 -128 (0x80) 并保留所有其他字节