OSX 32 位的 Clang 是否支持 AVX 512 内在函数?
Are AVX512 instrinsics supported in Clang on OSX 32-bit?
在 OSX 下使用 AVX512 内在函数时,我遇到了数百万个错误,但只有在构建 32 位应用程序时,64 位才可以。是否支持?我通过 x86intrin.h 和 immintrin.h 包含它。 zmmintrin.h 显然根本不存在...
我可以在 Godbolt (https://godbolt.org/z/d-mnAy) 上用 clang6.0 (mainline, not Apple's version) 重现它,但不能用 clang7.0.
这可能是一个错误,但英特尔将 _mm512_maskz_set1_epi64
列为 vpbroadcastq zmm {k}, r64
的内在函数,这显然仅在 64 位模式下可用。
当然这很傻,而且 vpbroadcastq
带有内存或 xmm 源的在 32 位模式下仍然可用。在 32 位模式下支持它的最新 clang 版本将此代码编译为 non-broadcast 向量常量加载,即使在 64 位模式下也是如此:
#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-bit-mode-only。您可以使用 headers 使用的相同 built-ins 为 32 位模式定义自己的模式。
在 OSX 下使用 AVX512 内在函数时,我遇到了数百万个错误,但只有在构建 32 位应用程序时,64 位才可以。是否支持?我通过 x86intrin.h 和 immintrin.h 包含它。 zmmintrin.h 显然根本不存在...
我可以在 Godbolt (https://godbolt.org/z/d-mnAy) 上用 clang6.0 (mainline, not Apple's version) 重现它,但不能用 clang7.0.
这可能是一个错误,但英特尔将 _mm512_maskz_set1_epi64
列为 vpbroadcastq zmm {k}, r64
的内在函数,这显然仅在 64 位模式下可用。
当然这很傻,而且 vpbroadcastq
带有内存或 xmm 源的在 32 位模式下仍然可用。在 32 位模式下支持它的最新 clang 版本将此代码编译为 non-broadcast 向量常量加载,即使在 64 位模式下也是如此:
#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-bit-mode-only。您可以使用 headers 使用的相同 built-ins 为 32 位模式定义自己的模式。