diff --git a/LbDevTools/data/cmake/BinaryTagUtils.cmake b/LbDevTools/data/cmake/BinaryTagUtils.cmake index e7fcad764118e191226671d5dc3f97d5bb17e7b4..76d2dd343fe1741286250339c68f570c64d0723b 100644 --- a/LbDevTools/data/cmake/BinaryTagUtils.cmake +++ b/LbDevTools/data/cmake/BinaryTagUtils.cmake @@ -65,13 +65,16 @@ set(BTU_KNOWN_x86_ARCHS x86_64 core2 + x86_64_v2 nehalem westmere sandybridge ivybridge + x86_64_v3 haswell broadwell skylake + x86_64_v4 skylake_avx512 canonlake @@ -172,12 +175,12 @@ function(check_compiler) parse_binary_tag() endif() - if(BINARY_TAG_COMP_NAME STREQUAL "gcc" AND NOT CMAKE_COMPILER_IS_GNUCXX) + if(BINARY_TAG_COMP_NAME STREQUAL "gcc" AND NOT CMAKE_CXX_COMPILER_ID STREQUAL "GNU") message(WARNING "BINARY_TAG states compiler is gcc, but ${CMAKE_CXX_COMPILER} is not GNU") - elseif(BINARY_TAG_COMP_NAME STREQUAL "clang" AND NOT CMAKE_CXX_COMPILER MATCHES "clang") - message(WARNING "BINARY_TAG states compiler is clang, but ${CMAKE_CXX_COMPILER} is not") - elseif(BINARY_TAG_COMP_NAME STREQUAL "icc" AND NOT CMAKE_CXX_COMPILER MATCHES "icpc") - message(WARNING "BINARY_TAG states compiler is Intel, but ${CMAKE_CXX_COMPILER} is not") + elseif(BINARY_TAG_COMP_NAME STREQUAL "clang" AND NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + message(WARNING "BINARY_TAG states compiler is clang, but ${CMAKE_CXX_COMPILER} is not Clang") + elseif(BINARY_TAG_COMP_NAME STREQUAL "icc" AND NOT CMAKE_CXX_COMPILER_ID STREQUAL "Intel") + message(WARNING "BINARY_TAG states compiler is Intel, but ${CMAKE_CXX_COMPILER} is not Intel") endif() if(BINARY_TAG_COMP_VERSION) diff --git a/LbDevTools/data/cmake/GaudiBuildFlags.cmake b/LbDevTools/data/cmake/GaudiBuildFlags.cmake index 21ca4e665c1e626a865f40ca13477e9fac5a7844..bc32833405fccf9e2887cf363c369afb3627e500 100644 --- a/LbDevTools/data/cmake/GaudiBuildFlags.cmake +++ b/LbDevTools/data/cmake/GaudiBuildFlags.cmake @@ -253,6 +253,23 @@ if(NOT GAUDI_FLAGS_SET EQUAL GAUDI_FLAGS_OPTIONS) else() # special architecture flags string(REPLACE "_" "-" _gcc_arch_name ${BINARY_TAG_ARCH}) + # (microarchitecture levels workaround for gcc < 11.0, clang < 12.0 and any other compiler) + if(_gcc_arch_name MATCHES "^x86-64-v[2-4]" + AND ((CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "11.0") + OR (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "12.0") + OR NOT (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang"))) + # v2 + list(APPEND GAUDI_ARCH popcnt sse3 sse4.1 sse4.2 ssse3 cx16 sahf) + if(_gcc_arch_name MATCHES "x86-64-v[3-4]") + # v3 + list(APPEND GAUDI_ARCH avx avx2 bmi bmi2 f16c fma lzcnt movbe xsave) + endif() + if(_gcc_arch_name MATCHES "x86-64-v4") + # v4 + list(APPEND GAUDI_ARCH avx512f avx512bw avx512cd avx512dq avx512vl) + endif() + set(_gcc_arch_name "x86-64") + endif() set(arch_opts "-march=${_gcc_arch_name}") foreach(_arch_opt ${GAUDI_ARCH}) if(_arch_opt STREQUAL "native")