OSX 32位上的Clang是否支持AVX512内在函数?

时间:2018-10-16 19:34:53

标签: macos clang avx512

在OSX下使用AVX512内部函数时,我会收到数百万个错误,但只有在构建32位应用程序时,才可以使用64位。支持吗?我通过x86intrin.h和immintrin.h包含了它。 zmmintrin.h显然根本不存在...

1 个答案:

答案 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位模式。