提问人:Mr. Noob 提问时间:8/20/2023 最后编辑:Peter CordesMr. Noob 更新时间:8/20/2023 访问量:52
GCC 在使用 clang 时抛出错误,工作正常_mm512_permutevar_epi32
GCC throwing an error while clang works fine while using _mm512_permutevar_epi32
问:
我从 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。
答:
不应该有内在的,永远不要使用它。_mm512_permutevar_epi32
将 _mm512_permutexvar_epi32
内部函数用于 vpermd
指令。
英特尔在他们的内在指南中记录了它,但这是糟糕和误导性的命名。对于同一指令的相同形式,我们不需要两个不同的内部函数,尤其是不遵循先前命名约定的内部函数。在某些方面,GCC 没有提供错误命名的内在函数是一件好事。英特尔的 asm 手动输入 (https://www.felixcloutier.com/x86/vpermd:vpermw) 仅列出了内部函数,因此这很好。vpermd
permutexvar
内部函数指南文档甚至说:
此内部函数与 相同,建议您使用该内部函数名称。
_mm512_permutexvar_epi32
以前的命名惯例是,车道交叉像(这个)一样洗牌并在他们的名字中得到一个,但车道内的洗牌像(使用矢量控制和即时)一样。vpermd
vpermps
x
vpermilps
_mm512_permutevar_ps
_mm512_permute_ps
没有等价的整数,只有即时控制 () 和车道交叉,因此按照车道随机命名模式命名内部函数具有误导性,尤其是当相同名称的版本存在差异时。(两者都从 AVX2 开始就存在。__m512i
vpermilps vec,vec,vec
vpshufd vec,vec,imm8
_mm512_shuffle_epi32
vpermd
_ps
vpermps
vpermilps
一般来说,含义相同的不同名称会增加混乱,并使事情更难在精神上跟踪,尤其是当其中一个没有任何错误或不清楚时。
我赞成英特尔的字节移位新名称,名称中的“b”强调它不是位移,不是 128 位版本的 .在这种情况下,我认为新名称增加了清晰度。256 位和 512 位版本反映了 over 而不是 的车道内性质,这很不寻常,但可能是一个很好的提醒。_mm_bslli_si128
pslldq
_mm_slli_epi64
_mm256_bslli_epi128
si128
不像这里,非名称会消除清晰度。也许英特尔的某个人犯了一个错误,先添加了非名称?不知何故,他们在发布之前没有发现这一点,因为我假设在这种情况下,这两个名称是同时添加到指南中的(因为如果 GCC 只支持较新的名称会很奇怪),这与新名称出现的情况不同。x
x
bslli
或者,也许这个名字确实在硬件发布之前和 GCC 添加对两者的支持之前就进入了早期出版物,或者 GCC 开发人员自己发现了不一致之处并引起了英特尔的注意,因为英特尔的文档现在确实建议不要使用它。permutevar
vpermd
这种命名怪异也与错误的情况有些相似:英特尔为非屏蔽负载引入了冗余内部函数,在此范围内未声明“_mm512_loadu_epi64”。128 位和 256 位版本确实允许您使用而不必使用,但缺点是很容易与内部函数混淆,用于窄负载 ()。void*
_mm_loadu_si128((const __m128i*)&arr[i])
movd
movq
_mm_loadu_si32
评论
*_set_epi64
中的删除有关。 不再有烦人了。然后承认错误:该内部名称与_mm512_permutexvar_epi32
相同,建议您使用该内部名称,指南说x
__mm512_set_epi64
x
x
epi64x
_mm_set_epi64
__m64
int64_t
_mm256_set_epi64x
_mm256_set_epi64
permutex
)
评论