Assembly 什么';VPERMILPS指令的要点是什么?

Assembly 什么';VPERMILPS指令的要点是什么?,assembly,x86,avx,instruction-set,Assembly,X86,Avx,Instruction Set,AVX指令集引入了VPERMILPS,这似乎是SHUFPS的简化版本(适用于两个输入寄存器相同的情况) 例如,以下说明: c5 f0 c6 c1 00 vshufps xmm0,xmm1,xmm1,0x0 可替换为: c4 e3 79 04 c1 00 vpermilps xmm0,xmm1,0x0 正如您所看到的,VPERMILPS版本需要额外的一个字节,并执行相同的操作。根据指令表,这两条指令都需要1个CPU周期,并且具有相同的吞吐量 引入这种指导有什么意义

AVX指令集引入了VPERMILPS,这似乎是SHUFPS的简化版本(适用于两个输入寄存器相同的情况)

例如,以下说明:

c5 f0 c6 c1 00          vshufps xmm0,xmm1,xmm1,0x0
可替换为:

c4 e3 79 04 c1 00       vpermilps xmm0,xmm1,0x0
正如您所看到的,VPERMILPS版本需要额外的一个字节,并执行相同的操作。根据指令表,这两条指令都需要1个CPU周期,并且具有相同的吞吐量


引入这种指导有什么意义?我遗漏了什么吗?

是的,使用
vpermilps
-与
vshufps
相比,immediate通常是遗漏的优化(骑士着陆时除外),在相同性能的相同操作中浪费1字节的代码大小


我认为
vpermilps
的要点是它可以与向量控制操作数一起使用。在AVX之前,唯一的变量控制洗牌是整数
pshufb

-使用来自ymm3/m256的控件在ymm2中排列单精度浮点值,并将结果存储在ymm1中


当然,直接形式有一个完全独立的操作码,你会问为什么它会存在。英特尔肯定只包括矢量版本,所以问题变成了“为什么他们包括即时版本?”至少需要一点额外的解码硬件。洗牌单元已经有硬件以这种形式解包立即控制操作数,因为它与
vshufps
相同,所以实现起来可能比较便宜

使用immediate
vpermilps
所能做的唯一一件事是在一条指令中加载+洗牌,就像
vpermilps ymm0[rdi],0b0001011
那样反转源代码每个通道中的元素。但与大多数具有立即数的指令一样,它不能对内存操作数进行微融合,因此前端仍然是2个融合域UOP。(在AMD CPU上,它确实节省了前端带宽。)不过,它与vmovups ymm0相比,节省了代码大小,[rdi]/
vshufps ymm0,ymm0,ymm0,0b00011011

除此之外,我看不出有什么意义。它们都在两个128位通道中执行相同的洗牌,为两个通道重用立即数的4x2位字段。(While和两者都在其即时中使用1位字段,并且可以在每个通道中执行不同的洗牌;上层通道使用位2和3。ZMM版本在上层256中使用位4..7。因此,
vpermilpd dst,src,imm
vshufpd dst,src,src,imm
相同,除非您使用内存源或使用洗牌控制ol矢量而不是立即数。)

这让你怀疑英特尔是否忘记了VEX编码将使非破坏性的
vshufps
能够对即时洗牌执行相同的操作


或者他们可能考虑了低功耗的CPU,如Knight's Landing(至强Phi),其中单源洗牌更便宜:

vpermilps
具有1个周期的吞吐量,但是
vshufps
vperm2f128
具有2个周期的吞吐量和额外的延迟周期。(根据)

因此,对相同的输入使用两次
vshufps
,速度较慢

但在英特尔的大核心主流CPU上,使用
vpermilps
-immediate与
vshufps
相比是一个遗漏的优化,除非您可以将其与内存源一起使用
vshufps
将需要两次相同的内存源,这显然是不可编码的

AVX的设计比KNL早了几年,但ISA的设计者可能已经想到,也许未来的CPU可以通过更简单的洗牌来提高效率。

常规Silvermont(KNL基于的无序原子)不支持AVX,但它具有1 uop/1周期吞吐量和
shufps
的延迟。对于
shufps
,Goldmont的吞吐量为0.5c


顺便说一句,英特尔还没有用AVX制造出低功耗的内核(Xeon Phi除外)。我认为他们不打算与Goldmont Plus的继任者Gracemont或Gracemont合作。

vpermilps合作有三个“正交”选项:1。单人包装与双人包装,2。即时混洗控制整数与可变控制向量,以及3。128位xmm对256位ymm。选择不同的组合,将产生8个不同版本的
vpermilps
。巧合的是,其中一个具有与
vshufps
相同的行为。因此,如果
vpermilps xmm0,xmm1,0x0
不存在,那么它就不符合逻辑。然而,人们可能更喜欢
vshufps xmm0、xmm1、xmm1,0x0
,这实际上节省了一个字节。(我不确定这个评论是否适合作为答案。)然而,问题仍然存在,为什么带有直接控制整数的
vpermilps
会存在,因为还有
vshufpd
。re:您的编辑:只有
shufps
的SSE编码不会修改上层车道,是的,
vpermilps
不提供该选项。但您的示例是
vshufps
,它没有上行链路,可以复制和洗牌。我想这在CPU上可能很有用,因为它不会导致AVX/SSE转换暂停(Haswell/Broadwell除外),比如插入YMM的SSE
pinsrd/q
。我想,如果您避免使用xmm8..15中的REX前缀,那么使用SSE1 SHUFP还可以节省更多的代码字节。仅一个2字节操作码+modrm+imm8=总共4个字节,而2字节VEX+操作码为5个字节。