在OSX下使用AVX512内部函数时,我会收到数百万个错误,但只有在构建32位应用程序时,才可以使用64位。支持吗?我通过x86intrin.h和immintrin.h包含了它。 zmmintrin.h显然根本不存在...
答案 0 :(得分:0)
我可以在Godbolt(https://godbolt.org/z/d-mnAy)上使用clang6.0(主版本,不是Apple版本)来重现它,但在clang7.0上不能。
这可能是一个错误,但是英特尔将_mm512_maskz_set1_epi64
作为vpbroadcastq zmm {k}, r64
的内在函数,显然只有在64位模式下才可用。
这当然很愚蠢,并且带有内存或xmm源的vpbroadcastq
在32位模式下仍然可用。即使在64位模式下,最新的以32位模式支持它的clang版本也可以将此代码编译为向量常量的非广播负载:
#include <immintrin.h>
__m512i foo() {
return _mm512_maskz_set1_epi64(0xf0, 123);
}
但是,虽然clang5.0和更早版本在64位模式下像这样编译它:
foo: # @foo
mov al, -16
kmovd k1, eax
mov eax, 123
vpbroadcastq zmm0 {k1} {z}, rax
ret
clang 5.0 -m32给出了内部编译器错误。
我没有Mac来尝试实际的Xcode,但是很显然,某些clang / LLVM版本将_mm512_maskz_set1_epi64
和_mm512_set1_epi64
视为仅64位模式。您可以使用标头使用的相同内置函数来定义自己的32位模式。