AVX2 中的 VPERMB 在哪里?

Where is VPERMB in AVX2?

AVX2 有很多好东西。例如,它有很多指令,这些指令比它们的前身严格得多。以 VPERMD 为例:它允许您完全任意地 broadcast/shuffle/permute 从一个 256 位长向量的 32 位值到另一个,在运行时使用排列 selectable1 。从功能上讲,这会淘汰大量现有的旧解包、广播、置换、随机播放和移位指令3.

酷豆。

那么VPERMB在哪里?即,相同的指令,但处理字节大小的元素。或者,就此而言,对于 16 位元素,VPERMW 在哪里?涉足 x86 汇编一段时间后,很明显 SSE PSHUFB 指令几乎是有史以来最有用的指令之一。它可以进行任何可能的排列、广播或逐字节随机播放。此外,它还可以用来做16个并行的4-bit -> 8-bit table lookups2.

不幸的是,PSHUFB 未在 AVX2 中扩展为跨车道,因此它仅限于车道内行为。 VPERM 指令能够进行交叉洗牌(事实上,"perm" 和 "shuf" 似乎是指令助记符中的同义词?) - 但 8 位和 16 位版本被省略了?

似乎甚至没有一个很好的方法来模拟这条指令,而你可以很容易地用更小宽度的指令模拟更大宽度的随机播放(通常,它甚至是免费的:你只需要一个不同的掩码) .

我毫不怀疑 Intel 知道 PSHUFB 的广泛和大量使用,所以自然会出现为什么在 AVX2 中省略字节变体的问题。该操作本质上更难在硬件中实现吗?是否存在强制省略它的编码限制?


1By selectable at runtime,我的意思是定义洗牌行为的掩码来自寄存器。这使得指令比采用立即洗牌掩码的早期变体灵活一个数量级,就像 addinc 更灵活或变量移位比立即更灵活一样转变。

2或 AVX2 中的 32 个这样的查找。

3较旧的指令如果具有较短的编码或避免从内存中加载掩码,偶尔会有用,但在功能上它们已被取代。

我 99% 确定主要因素是晶体管的实施成本。它显然非常有用,它不存在的唯一原因是实施成本必须超过重大收益。

编码 space 问题不太可能; VEX 编码 space 提供了很多空间。就像,真的很多,因为表示前缀组合的字段不是位字段,它是一个整数,其中大部分值未使用。

不过,他们决定为 AVX512VBMI 实现它,在 AVX512BW 和 AVX512F 中提供更大的元素尺寸。也许他们意识到没有这个有多糟糕,并决定无论如何都要这样做。 AVX512F 需要大量芯片面积/晶体管来实现,以至于英特尔决定甚至不在零售台式机 CPU 中实现它 for a couple generations

(部分原因是我认为现在很多可以利用全新指令集的代码被写入已知服务器上的 运行,而不是 运行time dispatching for在客户端机器上使用)。

根据维基百科,AVX512VBMI 直到 Cannonlake 才会出现,但随后我们将有 vpermi2b,它从 128B table(2 zmm 向量)进行 64 次并行 table 查找)). Skylake Xeon 只会带来 vpermi2w 和更大的元素尺寸 (AVX512F + AVX512BW)。


我很确定三十二个 32:1 多路复用器比八个 8:1 多路复用器贵很多,即使 8:1 多路复用器宽 4 倍。他们可以通过多个洗牌阶段(而不是单个 32:1 阶段)来实现它,因为跨车道洗牌需要 3 个周期的时间预算来完成他们的工作。但是还是很多晶体管。

我希望看到有硬件设计经验的人给出不那么生硬的答案。我曾经在面包板上用 TTL 计数器芯片构建了一个数字计时器(和 IIRC,在 TI-99/4A 上从 BASIC 读出计数器,这甚至在 20 年前就已经过时了),仅此而已。


It's pretty clear that the SSE PSHUFB instruction is pretty much among the most useful instructions of all time.

是的。这是第一个变量洗牌,带有来自寄存器而不是立即数的控制掩码。根据 pcmpeqb / pmovmskb 结果从洗牌掩码的 LUT 中查找洗牌掩码可以做一些疯狂而强大的事情。 是我最喜欢的超棒 SIMD 技巧示例之一。