【问题标题】:What is the difference between shuffle and permuteshuffle 和 permute 有什么区别
【发布时间】:2019-12-21 14:02:30
【问题描述】:

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

从表面上看,它们似乎都用于数据移动。有什么区别?

【问题讨论】:

    标签: x86 intel simd naming avx


    【解决方案1】:

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


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

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


    有 2 个例外,不包括vshufpsvpshufd 等的 VEX / EVEX 编码:

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

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

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


    就 shuffle 与 permute 而言,固有名称确实与指令助记符匹配,但当助记符具有“in lane”时,它可能会忽略“in lane”,这也需要lane-crossing 版本不同。 (例如,AVX1 vpermilps = _mm_permute_ps imm8 或 _mm_permutevar_ps __m128i 控制与 AVX2 vpermps = _mm256_permutexvar_ps;不可立即控制,但 vpermpd 可用。

    Intel 的内在函数指南仅列出了 _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 immediate 在pshufdvpermq-immediate 中的工作方式相同。但与“棘手的”vshuff32x4 案例不同,pshufdvpermq 的工作方式显而易见,因此无需与另一个助记符进行类比。此外,"pshuf" 与 "shuf" 或 "perm" 相比有点尴尬,所以我明白他们为什么想要其他东西作为压缩整数。

    请注意,“shuf”名称一直追溯到 SSE1 shufps,由 Pentium 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 附录很有帮助,因为它按介绍顺序将助记符分类。这让我注意到 AVX512 中的 vshuff32x4 助记符在我认为他们已经切换到调用所有内容之后“烫发”。)

    【讨论】:

    • 优秀的答案。 _mm256_permutexvar_ps 似乎从内在函数指南中消失了?
    • @BeeOnRope:在 ISA 参考文献中。内在函数指南仅列出 _mm256_permutevar8x32_ps 对应 vpermps_mm256_permute4x64_pd 对应 vpermpd。英特尔在那里真的走得很深,编造了听起来像 AVX512 的名称,其中每个元素的掩蔽很重要。我没有检查哪些编译器支持哪个名称。我以前遇到过这种情况,但我忘记了我当时发现的情况。
    猜你喜欢
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多