gpt4 book ai didi

x86 - shuffle 和 permute 有什么区别

转载 作者:行者123 更新时间:2023-12-03 20:27:41 30 4
gpt4 key购买 nike

在 x86-64 SIMD 指令名称中,以及 intrinsic可用于从 C/C++ 访问它们的函数,您会发现术语 shuffle(例如, _mm_shuffle_epi32 )和置换(例如, _mm_permute_pd )。

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

最佳答案

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

我认为他们只是在某个时间点从“洗牌”切换到“置换” SSSE3之间pshufb和 AVX1 vpermilps/pd/vperm2f128 . AVX 之前的所有内容都称为“shuffle”,之后的所有内容都称为“permute”。

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

有 2 个异常(exception) , 不包括 vshufps 的 VEX/EVEX 编码, vpshufd , 等等。:

AVX512F VSHUFF32X4 (以及 64x2 和整数版本)具有即时控制的 128 位粒度 channel 混洗 vshufps 的设计相同 :目标的低半部分从第一个源中选择元素,高半部分从第二个源中选择。例如_mm512_shuffle_i64x2(__m512i a, __m512i b, int imm); 这种命名有助于记住 shuffle 控件的工作原理。 有 4 个输出 channel ,只有 4x 2 位选择器的空间,而不是 4x 3 位选择器。 256 位操作数大小版本仍然具有相同的限制,因此它仅使用立即数的低 2 位,例如 shufpd .

AVX512BITALG VPSHUFBITQMB 就像 vpmultishiftqb (并行位域提取)+ 向量-> 掩码(如移动掩码)。因此它可以选择输入的每个 qword 块中的任何 8 位。

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

就shuffle 和permute 而言,内在名称确实匹配指令助记符,但是当助记符具有它时,可能会遗漏“inlane”,这需要跨车道版本也不同。 (例如 AVX1 vpermilps = _mm_permute_ps imm8 或 _mm_permutevar_ps __m128i 控制与 AVX2 vpermps = _mm256_permutexvar_ps ;不能直接控制,但 vpermpd

英特尔的内在指南仅列出 _mm256_permutevar8x32_psvpermps ,而 ISA 引用手册仅列出 permutexvar .我假设大多数编译器都支持较旧的 permutexvar姓名。无论如何,奇怪的选择,8x32 听起来像是一条 AVX512 指令(带有每个元素的掩码);也许这就是新的内在名称的来源。

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

  • 复制和洗牌 ( pshufd xmm, xmm/mem, imm ) 与就地洗牌 ( pshufb data, idxshufps xmm, xmm, imm )
  • 即时控制与可变控制(pshufd 与 pshufb 或 AVX2 vpermd 与 vperm2i128)
  • 整数与 FP(SSE2 pshufd 与 shufps/pd ;AVX2 vpermps 与 vpermd)
  • 1 源与 2 源(pshufd 与 shufps;AVX2 vpermd 与 AVX512 vpermt2d)
  • 车道交叉与车道内(AVX1 vpermilps 与 AVX2 vpermps)

  • shuffle-control 立即在 pshufd 中的工作方式相同和 vpermq -即时。但不像“棘手” vshuff32x4案例,两者 pshufdvpermq以显而易见的方式工作,因此无需对另一个助记符进行类比。另外, “pshuf”与“shuf”或“perm”相比有点尴尬,所以我明白为什么他们想要其他东西来打包整数。

    请注意,“shuf”名称一直追溯到 SSE1 shufps , 由 P​​entium III (Katmai) 与 MMX2 同时推出 pshufw mm, mm, imm8 .

    P5 Pentium MMX 没有任何名为 shuf/perm 指令的指令,只有 punpckl/h各种大小的洗牌。

    https://nasm.us/doc/nasmdocb.html#section-B.1.7 (那个 NASM 附录很有帮助,因为它按照介绍的顺序将助记符分组。这让我注意到了 vshuff32x4 助记符在 AVX512 的东西中,在我认为他们已经切换到将所有东西都称为“烫发”之后。)

    关于x86 - shuffle 和 permute 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57504420/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com