AVX2有很多好东西。例如,它有很多指令,它们比它们的前体更加强大。采取 VPERMD
:它允许您从一个256位长的32位值向量中完全任意地广播/混洗/置换到另一个,并且在运行时可以选择置换1。在功能上,它废除了大量现有的旧解包,广播,置换,随机和移位指令3。
凉豆。
那么在哪里 VPERMB
?即,相同的指令,但在字节大小的元素上工作。或者,就此而言,在哪里 VPERMW
,对于16位元素?已经涉足x86程序集已经有一段时间了,很明显SSE PSHUFB
指令几乎是有史以来最有用的指令之一。它可以进行任何可能的排列,广播或逐字节混洗。此外,它还可用于执行16个并行4位 - > 8位表查找2。
不幸, PSHUFB
未被扩展为AVX2中的跨车道,因此仅限于车道内行为。该 VPERM
指令能够交叉shuffle(事实上,“perm”和“shuf”似乎是指令助记符中的同义词?) - 但是8位和16位版本被省略了?
甚至似乎没有一种好的方法来模拟这个指令,而你可以轻松地模拟宽度较小的shuffles(通常,它甚至是免费的:你只需要一个不同的面具)。
我毫不怀疑英特尔意识到广泛而重要的使用 PSHUFB
因此,自然会出现在AVX2中为什么省略字节变体的问题。操作本质上难以在硬件中实现吗?是否有编码限制迫使其遗漏?
1通过在运行时选择,我的意思是定义混洗行为的掩码来自寄存器。这使得指令比采用直接随机掩码的早期变体更加灵活,其方式与之相同 add
比...更灵活 inc
或者变速换档比立即换档更灵活。
2或者在AVX2中进行32次这样的查找。
3如果较旧的指令具有较短的编码,或者避免从内存中加载掩码,则它们偶尔会有用,但在功能上它们会被取代。
我99%肯定主要因素是晶体管的实施成本。它显然是非常有用的,并且它不存在的唯一原因是实施成本必须超过重大利益。
编码空间问题不大可能; VEX编码空间提供了很多空间。就像,真的很多,因为表示前缀组合的字段不是位字段,它是一个整数,大部分值都未使用。
他们决定为AVX512VBMI实现它,AVX512BW和AVX512F提供更大的元件尺寸。也许他们意识到有多少人没有这个,并且无论如何都决定去做。 AVX512F需要大量的芯片面积/晶体管来实现,以至于英特尔决定甚至不在零售桌面CPU中实现它 几代人。
(部分原因是我认为现在很多可以利用全新指令集的代码编写为在已知服务器上运行,而不是在客户端机器上运行的运行时调度)。
据维基百科称,AVX512VBMI直到Cannonlake才会出现,但随后我们将会有 vpermi2b
,它从128B表中执行64次并行表查找(2个zmm向量))。 Skylake Xeon只会带来 vpermi2w
更大的元件尺寸(AVX512F + AVX512BW)。
我很确定32个32:1的复用器比8个8:1的复用器贵得多,即使8:1的复用器宽4倍也是如此。他们可以通过多个洗牌阶段(而不是单个32:1阶段)实施它,因为车道交叉洗牌可以获得3个周期的时间预算来完成他们的工作。但仍然有很多晶体管。
我很乐意看到有硬件设计经验的人不那么亲切的回答。我曾经在面包板上用TTL计数器芯片建立了一个数字定时器(和IIRC一样,从TI-99 / 4A的BASIC读出计数器,即使在大约20年前也是如此),但就是这样。
SSE非常清楚 PSHUFB 指令几乎是有史以来最有用的指令之一。
对。这是第一个变量shuffle,带有来自寄存器的控制掩码而不是立即数。从基于a的shuffle mask的LUT中查找一个shuffle mask pcmpeqb
/ pmovmskb
结果可以做一些疯狂有力的事情。 @ stgatilov的IPv4 dotted-quad - > int converter 是我最喜欢的SIMD技巧之一。