【发布时间】:2019-11-19 04:55:33
【问题描述】:
英特尔的 AVX-512 扩展的一个好处是,除了向量寄存器之外,几乎所有操作都可以通过提供一个 kreg 来屏蔽,该 kreg 指定了应用于操作的屏蔽:排除的元素通过掩码可以设置为零或保留其先前的值。
kreg 的一个特别常见的用途是创建一个掩码,该掩码在向量的开头或结尾排除 N 个连续元素,例如,作为向量化循环中的第一次或最后一次迭代,其中将处理少于完整向量的向量.例如,对于超过 121 个int32_t 值的循环,前 112 个元素可以由 7 个完整的 512 位向量处理,但剩下的 9 个元素可以通过仅对前 9 个元素进行操作的掩码操作来处理。
所以问题是,给定一个(运行时值)整数 r,它是 0 - 16 范围内的某个值,代表剩余元素,加载 16 位 kreg 的最有效方法是什么,使得低 @987654324 @ 位已设置,其余位未设置? KSHIFTLW 似乎不适合这个目的,因为它只需要立即。
【问题讨论】:
-
我假设/希望
(~0) >> (16-r)可以有效地编译为 32 位 MOV-immediate + SHRX + KMOVW。错误我猜那里也有一个 sub 或 neg,x86 移位仅用&31掩盖它们的计数,而不是&15用于 15 位移位。英特尔 CPU 上的更好序列可能是xor-zero / BTS / DEC / KMOVW -
this question 的可能重复项。
标签: optimization x86 simd avx512