diff options
author | Damjan Marion <damarion@cisco.com> | 2020-04-29 15:15:45 +0200 |
---|---|---|
committer | Florin Coras <florin.coras@gmail.com> | 2020-04-29 20:04:03 +0000 |
commit | 6e39ff03a6fa28a2655d767454394413252a269d (patch) | |
tree | 9f6baa9fabadc2c48fda2e68b0a2d066895bb853 | |
parent | 5a7f2f1224716130b50e48232e4c276fbebe63bc (diff) |
build: detect GNU Assembler AVX-512 bug and disable AVX-512 variants if needed
Type: fix
Change-Id: I098f6c79be3c2e4db001edc0cf0a229bf6e0b13d
Signed-off-by: Damjan Marion <damarion@cisco.com>
-rw-r--r-- | src/cmake/cpu.cmake | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/src/cmake/cpu.cmake b/src/cmake/cpu.cmake index e407978ea37..916fe0d1ddd 100644 --- a/src/cmake/cpu.cmake +++ b/src/cmake/cpu.cmake @@ -56,6 +56,22 @@ set(VPP_LOG2_CACHE_LINE_SIZE ${VPP_LOG2_CACHE_LINE_SIZE} CACHE STRING "Target CPU cache line size (power of 2)") ############################################################################## +# Gnu Assembler AVX-512 bug detection +# - see: https://sourceware.org/bugzilla/show_bug.cgi?id=23465 +############################################################################## +if(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64.*|x86_64.*|AMD64.*") + if (CMAKE_C_COMPILER_ID STREQUAL "GNU") + set(pfx ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/gas_avx512_bug_test) + file(WRITE ${pfx}.s "vmovaps 0x40(,%rax), %zmm0\n") + execute_process(COMMAND ${CMAKE_C_COMPILER} -c ${pfx}.s -o ${pfx}.o) + execute_process(COMMAND objdump -s ${pfx}.o OUTPUT_VARIABLE _output) + if (NOT _output MATCHES "62f17c48 28040540 000000") + set(GNU_ASSEMBLER_AVX512_BUG 1) + endif() + endif() +endif() + +############################################################################## # CPU optimizations and multiarch support ############################################################################## if(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64.*|x86_64.*|AMD64.*") @@ -64,10 +80,14 @@ if(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64.*|x86_64.*|AMD64.*") if(compiler_flag_march_core_avx2) list(APPEND MARCH_VARIANTS "avx2\;-march=core-avx2 -mtune=core-avx2") endif() - check_c_compiler_flag("-march=skylake-avx512" compiler_flag_march_skylake_avx512) - check_c_compiler_flag("-march=icelake-client" compiler_flag_march_icelake_client) - if(compiler_flag_march_skylake_avx512) - list(APPEND MARCH_VARIANTS "avx512\;-march=skylake-avx512 -mtune=skylake-avx512") + if (GNU_ASSEMBLER_AVX512_BUG) + message(WARNING "AVX-512 multiarch variant(s) disabled due to GNU Assembler bug") + else() + check_c_compiler_flag("-march=skylake-avx512" compiler_flag_march_skylake_avx512) + check_c_compiler_flag("-march=icelake-client" compiler_flag_march_icelake_client) + if(compiler_flag_march_skylake_avx512) + list(APPEND MARCH_VARIANTS "avx512\;-march=skylake-avx512 -mtune=skylake-avx512") + endif() endif() elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64.*|AARCH64.*)") set(CMAKE_C_FLAGS "-march=armv8-a+crc ${CMAKE_C_FLAGS}") |