GCC 在使用 clang 时抛出错误,工作正常_mm512_permutevar_epi32

GCC throwing an error while clang works fine while using _mm512_permutevar_epi32

提问人:Mr. Noob 提问时间:8/20/2023 最后编辑:Peter CordesMr. Noob 更新时间:8/20/2023 访问量:52

问:

我从 GCC 编译器收到此错误 -

错误:没有依赖于模板参数的“_mm512_permutevar_epi32”参数,因此“_mm512_permutevar_epi32”的声明必须可用 [-fpermissive]

rev = _mm512_permutevar_epi32(_mm512_setr_epi32(15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0), elem);

代码使用 clang 编译良好。我包含了 immintrin.h 和 x86intrin.h。

C++ GCC 内部函数 GCC 警告 AVX512

评论


答:

2赞 Peter Cordes 8/20/2023 #1

不应该有内在的,永远不要使用它。_mm512_permutevar_epi32

_mm512_permutexvar_epi32 内部函数用于 vpermd 指令。

英特尔在他们的内在指南中记录了它,但这是糟糕和误导性的命名。对于同一指令的相同形式,我们不需要两个不同的内部函数,尤其是不遵循先前命名约定的内部函数。在某些方面,GCC 没有提供错误命名的内在函数是一件好事。英特尔的 asm 手动输入 (https://www.felixcloutier.com/x86/vpermd:vpermw) 仅列出了内部函数,因此这很好。vpermdpermutexvar

内部函数指南文档甚至说:

此内部函数与 相同,建议您使用该内部函数名称。_mm512_permutexvar_epi32


以前的命名惯例是,车道交叉像(这个)一样洗牌并在他们的名字中得到一个,但车道内的洗牌像(使用矢量控制和即时)一样。vpermdvpermpsxvpermilps_mm512_permutevar_ps_mm512_permute_ps

没有等价的整数,只有即时控制 () 和车道交叉,因此按照车道随机命名模式命名内部函数具有误导性,尤其是当相同名称的版本存在差异时。(两者都从 AVX2 开始就存在。__m512ivpermilps vec,vec,vecvpshufd vec,vec,imm8_mm512_shuffle_epi32vpermd_psvpermpsvpermilps

一般来说,含义相同的不同名称会增加混乱,并使事情更难在精神上跟踪,尤其是当其中一个没有任何错误或不清楚时。


我赞成英特尔的字节移位新名称,名称中的“b”强调它不是位移,不是 128 位版本的 .在这种情况下,我认为新名称增加了清晰度。256 位和 512 位版本反映了 over 而不是 的车道内性质,这很不寻常,但可能是一个很好的提醒。_mm_bslli_si128pslldq_mm_slli_epi64_mm256_bslli_epi128si128

不像这里,非名称会消除清晰度。也许英特尔的某个人犯了一个错误,先添加了非名称?不知何故,他们在发布之前没有发现这一点,因为我假设在这种情况下,这两个名称是同时添加到指南中的(因为如果 GCC 只支持较新的名称会很奇怪),这与新名称出现的情况不同。xxbslli

或者,也许这个名字确实在硬件发布之前和 GCC 添加对两者的支持之前就进入了早期出版物,或者 GCC 开发人员自己发现了不一致之处并引起了英特尔的注意,因为英特尔的文档现在确实建议不要使用它。permutevarvpermd

这种命名怪异也与错误的情况有些相似:英特尔为非屏蔽负载引入了冗余内部函数,在此范围内未声明“_mm512_loadu_epi64”。128 位和 256 位版本确实允许您使用而不必使用,但缺点是很容易与内部函数混淆,用于窄负载 ()。void*_mm_loadu_si128((const __m128i*)&arr[i])movdmovq_mm_loadu_si32

评论

0赞 Alex Guteniev 8/20/2023
命名错误可能与 *_set_epi64 中的删除有关。 不再有烦人了。然后承认错误:该内部名称与_mm512_permutexvar_epi32相同,建议您使用该内部名称,指南说x__mm512_set_epi64x
0赞 Peter Cordes 8/20/2023
@AlexGuteniev: Thanks for pointing out that the intrinsics guide entry itself recommends the other name, I hadn't noticed that. But this is in a different place from the , which has/had a different meaning (to disambiguate MMX vs. x86-64 SSE2: Meaning of suffix "x" in intrinsics like "_mm256_set1_epi64x" - takes two args, not . They followed the naming pattern for even though there was no . So yes it's "annoying", but totally different meaning than xepi64x_mm_set_epi64__m64int64_t_mm256_set_epi64x_mm256_set_epi64permutex)