问题 AVX2中的VPERMB在哪里?


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如果较旧的指令具有较短的编码,或者避免从内存中加载掩码,则它们偶尔会有用,但在功能上它们会被取代。


6065
2018-06-23 00:09


起源

S /潺潺/玩水/?此外,“在运行时可选”的一个好词是“可变洗牌”。变速指令(如 vpsrlvd)已经使用这个术语。 - Peter Cordes
是, 玩水虽然喋喋不休也时常有意义。我不确定“变量”。我认为这种转变与“即时或非”问题几乎是正交的。问题是你不能为不同的向量元素发出不同的移位数。有点像矢量 add 只允许向所有元素添加单个值。这与参数是否只能被指定为立即不同。这个转变有点特别,因为大多数人都没有这个问题,这就是我对英特尔意味着“变量”的印象。 - BeeOnRope
哦,好的一点,你已经可以对xmm reg的low64中的所有元素进行移位计数。考虑到一些背景,我认为“变量洗牌”在没有解释的情况下立即显而易见。 - Peter Cordes
顺便说一句,你可以效仿 vpermi2b 约11条指令(13个uop)。如果您可以预处理多次使用的置换矢量,则会下降到5条指令(7 uop)。 - Mysticial


答案:


我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技巧之一。


10
2018-06-23 02:05



确实。我一直在笔记本电脑上,直到我得到一个Skylake。只是发现只有“Xeons”会得到AVX512,后来证明是指“服务器部件”,正如你所指出的那样(使Xeon品牌混乱)。内在指南也令人困惑,显示vpermi2b与大量内在函数相关,许多内容在VBMI之前出现。好的一个是在VBMI虽然:( - BeeOnRope
@BeeOnRope哦,英特尔几乎没有为AVX2 / Haswell付出太多努力。他们复制粘贴了他们的执行单位,并在其上打了一个非常轻量级的3个循环的横向通道。我怀疑他们重新设计了整个置换单元。如果我不得不猜测,他们将全部精力投入到3输入微操作(对于FMA),他们无法做任何事情。 - Mysticial
通过将所有的置换移动到端口5,它们消除了对来自其他端口的任何跨通道路由的需要。据我所知,在Haswell上,每个跨越64位边界的矢量指令都在端口5上。从那里,我们可以推断出,端口5是 只要 具有64位通道路由的端口(除了加载/存储单元)。从处理器设计的角度来看,这是一个非常重要的事情。我强调路由很多,因为它确实占用了那么多空间。虽然路由可堆叠(3D)在芯片中,但它们仍然只有少量几层。 - Mysticial
@BeeOnRope现在更新了AVX512硬件。 vpermw 只是32位和64位粒度置换的吞吐量的一半。延迟也是7个周期,而不是3.这意味着它通过32位置换单元进行双循环(每个3个周期),然后通过MUX选择正确的输出(1个周期)。所以如果,不要感到惊讶 vpermb on Cannonlake可以通过原生的16位置换进行双循环,也可以通过与Skylake X相同的32位置换进行四循环。虽然考虑到了模具收缩,但我不排除单循环吞吐量 vpermb。 - Mysticial
另一个更新:Cannon Lake的置换单元看起来像是原生的全向64路字节置换。 vpermw 和 vpermb 是单周期吞吐量。但是2矢量 vperm2b 是2周期吞吐量。所以不是 最好 可能的情况,但非常接近它。 / cc @BeeOnRope - Mysticial