首页 > 解决方案 > 在没有 AVX512_VBMI2 的情况下模拟 AVX512 VPCOMPESSB 字节打包

问题描述

我已经用 0-63 的字节整数数组填充了一个 zmm 寄存器。这些数字用作矩阵的索引。非零元素表示矩阵中包含数据的行。并非所有行都包含数据。

我正在寻找一条指令(或多个指令)来对 zmm 寄存器中的字节数组执行相同的操作,就像 VPCOMPRESSQ 对 zmm 寄存器中的 qword 数组所做的一样。

考虑第 3、6、7、9 和 12 行包含数据且所有其他行(总共 64 行或更少)为空的情况。掩码寄存器 k1 现在包含设置为 001001001001000 ... 0 的 64 位。

使用 VPCOMPRESSQ 指令,我可以使用 k1 压缩 zmm 寄存器,以便非零元素从寄存器的开头连续排列,但没有等效的字节指令。

PSHUFB 作为候选出现,但随机播放控制掩码必须是整数,而不是位。我可以获得一个整数数组 0 0 3 0 0 6 等,但我仍然将元素设置为零,我需要它们从 zmm 寄存器的开头连续排列。

所以我的问题是,给定一个带有字节数组的 zmm 寄存器,其中 k1 设置为如上所示,我怎样才能让非零元素从 zmm 寄存器的开头连续排列,就像 VPCOMPRESSQ 对 qwords 所做的那样?

AVX512VBMI2 有VPCOMPRESSB,但仅适用于 Ice Lake 及更高版本。Skylake-avx512 / Cascade Lake可以做什么?

标签: x86-64simdavxavx512

解决方案


推荐阅读