X86 洗牌和排列有什么区别

X86 洗牌和排列有什么区别,x86,intel,simd,naming,avx,X86,Intel,Simd,Naming,Avx,在x86-64 SIMD指令名以及可用于从C/C++访问它们的函数中,您可以找到术语shuffle(例如,\u mm\u shuffle\u epi32)和permute(例如,\u mm\u permute\u pd) 表面上看,它们似乎都用于数据移动。有什么不同吗?我没有在x86之外寻找灵感。我认为这里没有任何标准惯例 我想他们只是在SSSE3pshufb和AVX1vpermilps/pd/vperm2f128之间的某个时间点从“洗牌”切换到了“置换”。AVX之前的一切称为“洗牌”,之后的

在x86-64 SIMD指令名以及可用于从C/C++访问它们的函数中,您可以找到术语shuffle(例如,
\u mm\u shuffle\u epi32
)和permute(例如,
\u mm\u permute\u pd


表面上看,它们似乎都用于数据移动。有什么不同吗?

我没有在x86之外寻找灵感。我认为这里没有任何标准惯例


我想他们只是在SSSE3
pshufb
和AVX1
vpermilps/pd
/
vperm2f128
之间的某个时间点从“洗牌”切换到了“置换”。AVX之前的一切称为“洗牌”,之后的一切称为“置换”

(SSE4.x没有引入任何名为“shuffle”或“permute”的指令,只是
pinsrd
/
pextrd
和其他操作数大小是SSE4.1添加的主要混洗)


有两个例外,不包括
vshufps
vpshufd
等的VEX/EVEX编码:

(以及64x2和整数版本)具有即时控制的128位粒度通道混洗具有与
vshufps
相同的设计:目标的低一半从第一个源选择元素,高一半从第二个源选择元素。e、 g.
\u mm512\u shuffle\u i64x2(\uuuum512i a,\uuuum512i b,int imm)
此命名有助于记住随机播放控件的工作原理。对于4个输出通道,只有4个2位选择器的空间,而不是4个3位选择器的空间。256位操作数大小的版本仍然有相同的限制,因此它只使用立即数的低2位,如
shufpd

类似于(并行位场提取)+向量->掩码(类似于移动掩码)。因此,它可以在输入的每个qword块中选择任意8位

AVX512 256位粒度操作目前仅存在名称为VEXTRACTF32x8和VINSERTF32x8的操作,而不是shuf或perm


内在名称确实与指令助记符相匹配,如shuffle与permute,但如果助记符有“in-lane”,则可能会忽略它,这也要求车道交叉版本也不同。(例如,AVX1=
\u mm\u permute\u ps
imm8或
\u mm\u permutevar\u ps
\u m128i控件与AVX2=
\u mm256\u permutexvar\u ps
控件不可直接使用,但vpermpd是可用的

英特尔的《intrinsics guide》只列出了
\u mm256\u permutevar8x32\u ps
vpermps
,而ISA ref手册只列出了
permutexvar
。我想大多数编译器都支持较旧的
permutexvar
名称。不管怎样,奇怪的选择,8x32听起来像是AVX512指令(带有每元素屏蔽);也许这就是这个新的固有名称的来源


我没有注意到其他模式。我们可以轻松排除以下所有假设:

  • 复制和混洗(
    pshufd-xmm,xmm/mem,imm
    )与就地混洗(
    pshufb-data,idx
    shufps-xmm,xmm,imm
  • 即时控制与可变控制(pshufd与pshufb或AVX2 vpermd与vperm2i128)
  • 整数与FP(SSE2 pshufd与shufps/pd;AVX2 vpermps与vpermd)
  • 1源对2源(pshufd对SHUFP;AVX2 vpermd对AVX512 vpermt2d)
  • 车道交叉与车道内(AVX1
    vpermilps
    与AVX2
    vpermps
shuffle control immediate在
pshufd
vpermq
-immediate中的工作方式相同。但与“棘手的”
vshuff32x4
情况不同,
pshufd
vpermq
都以明显的方式工作,因此无需与另一个助记符进行类比。此外,pshuf”与“shuf”或“perm”相比有点尴尬,这样我就可以明白为什么他们希望压缩整数有其他功能。

请注意,“shuf”名称可以追溯到SSE1
shufps
,由奔腾III(Katmai)与MMX2
pshufw mm,mm,imm8同时引入

P5奔腾MMX没有任何名为shuf/perm指令的指令,只有
punpckl/h
不同大小的洗牌


(NASM附录很有帮助,因为它按照介绍的顺序将助记符分类。这让我注意到AVX512中的
vshuff32x4
助记符,因为我认为他们已经把所有东西都称为“perm”。)回答得很好。
\u mm256\u permutexvar\u ps
似乎在《内在论指南》中缺失了?@BeeOnRope:它在ISA参考中。内在论指南只列出了
\u mm256\u permutevar8x32\u ps
vpermps
vpermpd
\u mm256\u permute4x64\u pd
英特尔在这方面做得很彻底,弥补了不足听起来像AVX512的名称,每个元素的掩蔽很重要。我没有检查哪个编译器支持哪个名称。我以前遇到过这个问题,但我忘记了我当时发现了什么。