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