x86-64 - 在没有 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可以做什么?
解决方案
推荐阅读
- python - 如何使用 AWS 部署多个 TensorFlow 模型?
- java-8 - Java 8 加密问题
- python - 如何找到绘图和直线之间的交点
- php - 从 iphone 设备录制和上传的视频不会在 iphone 中播放
- asp.net - 未处理的拒绝(SyntaxError):JSON 中位置 0 的意外标记 <?
- python - 无法将 os.path.split(imagePath)[-1].split('.')[1] 转换为整数
- javascript - 如何将 vue.js 与 django 集成?
- android-emulator - Android Studio:模拟器在一段时间后不断崩溃
- python - 重置数据透视表中的列索引
- javascript - 什么是“특수”这种角色,我该如何处理?