assembly - 如何实现 vpmovmskb 对 ZMM 寄存器的影响?
问题描述
可追溯到 SSE 的古怪指令 (v)pmovmskb 获取 mm、xmm 或 ymm 寄存器中字节的最高有效位,并将它们移动到通用寄存器中。这对于分类向量元素或对单个位执行SWAR操作非常有用。具体来说,我在之前的答案中使用了这条指令来计算位置人口计数。
不幸的是,这条指令还没有扩展到 ZMM 寄存器,并且令人惊讶地没有出现在 AVX-512 名册中。如何有效地模拟 ZMM 寄存器的效果?我有哪些类似/其他选择?
解决方案
AVX512BW中有一个指令,只是名称不同。 _mm512_movepi8_mask
/
vpmovb2m k, zmm
,适用于从字节到 qword 的每个元素大小。
(D 和 Q 版本为 AVX512DQ,B 和 W 版本为 AVX512BW)。
还有 mask->vector inverse movemask,vpmovm2b
(同样适用于所有元素大小)。
AVX512 当然也有各种掩码指令cmp
,test
因此使用set1_epi8(1<<n)
向量,您可以使用 ; 将任何位位置抓取到掩码寄存器中vptestmb k2{k1}, zmm2, zmm3/m512
。_mm512_test_epi8_mask
. 请注意,与 不同的是vpmov2bm
,它支持对目标进行零掩码以有效地与另一个k
掩码进行免费的 AND 操作,因此即使您只想要高位也可能值得使用。
还有一个NAND版本vptestnmb
。这些的 D 和 Q 版本支持广播内存源操作数,但 B 和 W 版本不支持。
使用 8 个不同的掩码常数,您可以在展开循环中提取不同的位,而无需花费任何移位指令。或者您可以从不同的元素中提取不同的位。
这些都是 AVX512BW,自 Skylake-AVX512 起可在 AVX512 CPU 上使用,但不包括 Xeon Phi (KNL / KNM)。
推荐阅读
- cordova - 我应该在 Ionic 1.7.16 中使用什么版本的 Cordova
- python - Python - 数据框货币转换
- html - 如何从 iframe 读取响应
- complex-event-processing - 关于 esper CEP 的 match_recognize 语法的问题
- google-bigquery - Google Big Query 不仅仅显示项目特定的数据集
- c# - 无法使用 LINQ 连接从右侧列表中选择值
- python-3.x - 如何以所有可能的方式将列表划分为大小为 k 的子字符串
- robotframework - 使用ride.py 命令打开 RIDE(机器人框架 IDE)时出错
- react-native - 有什么方法可以在 React Native for iOS 中实现真正的暗模式?
- visual-studio - 特定于配置的 resw 资源字符串变体