用最少的指令代码旋转 AVX2 / AVX-512 寄存器中的所有压缩字节

问题描述

是否可以在少于 5 条指令中使用 AVX2/AVX-512 指令进行字节轮换? 由于我对内在函数不够熟悉,因此在汇编代码中寻找答案。

在 AVX-512 中,可以使用单个指令执行直接旋转!不幸的是,没有涵盖 WORD 和 BYTE 数据类型。移位可以缩小到 WORD 大小,因此最少需要 3 条指令(2 次移位和 1 条加/或/异或)。到目前为止,我想出的最好的方法是至少 5 条指令,如下所列。

zmm0 is loaded with 64 different byte values
SL3 = memory location of 64 continuous bytes of f8h value (for masking)
SR5 = memory location of 64 continuous bytes of 07h value (for masking)

vpslld zmm1,zmm0,3    ; shift DWORDS《 by 3 bits
vpandd zmm1,zmm1,SL3  ; clear low 3 bits,all bytes
vpsrl zmm2,5     ; shift DWORDS 》by 5 bits
vpandd zmm2,zmm2,SR5  ; clear high 5 bits,all bytes
vpord zmm1,zmm2  ; combine left/right shifts for rotation result

以上是向左旋转 3 位或向右旋转 5 位。并且所有 64 个字节都会产生正确的结果。

正如我所说,使用 WORD 大小(16 位),循环最少需要 3 条指令。但是由于需要 5 条指令在 zmm 寄存器中进行字节轮换,因此从 32 字节 AVX2 实现到 64 字节 AVX-512 算法,我仅实现了 50% 的性能提升。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)