【发布时间】:2019-12-21 14:02:30
【问题描述】:
在 x86-64 SIMD 指令名称以及可用于从 C/C++ 访问它们的 intrinsic 函数中,您可以找到两个术语 shuffle(例如,_mm_shuffle_epi32)和置换(例如,_mm_permute_pd)。
从表面上看,它们似乎都用于数据移动。有什么区别?
【问题讨论】:
在 x86-64 SIMD 指令名称以及可用于从 C/C++ 访问它们的 intrinsic 函数中,您可以找到两个术语 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 个例外,不包括vshufps、vpshufd 等的 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_ps 和 vpermps,而 ISA 参考手册仅列出了 permutexvar。我假设大多数编译器都支持旧的 permutexvar 名称。无论如何,奇怪的选择,8x32 听起来像 AVX512 指令(每个元素屏蔽);也许这就是新的内在名称的来源。
我没有注意到其他模式。 我们可以轻松排除以下所有假设:
pshufd xmm, xmm/mem, imm) 与就地随机播放(pshufb data, idx 或 shufps xmm, xmm, imm)vpermilps 与 AVX2 vpermps)shuffle-control immediate 在pshufd 和vpermq-immediate 中的工作方式相同。但与“棘手的”vshuff32x4 案例不同,pshufd 和 vpermq 的工作方式显而易见,因此无需与另一个助记符进行类比。此外,"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 似乎从内在函数指南中消失了?
_mm256_permutevar8x32_ps 对应 vpermps 和 _mm256_permute4x64_pd 对应 vpermpd。英特尔在那里真的走得很深,编造了听起来像 AVX512 的名称,其中每个元素的掩蔽很重要。我没有检查哪些编译器支持哪个名称。我以前遇到过这种情况,但我忘记了我当时发现的情况。