Autodetect CPU architecture and AVX2/512 in cmake
This commit is contained in:
+40
-29
@@ -193,45 +193,56 @@ endif ()
|
|||||||
if (CMAKE_BUILD_TYPE STREQUAL "")
|
if (CMAKE_BUILD_TYPE STREQUAL "")
|
||||||
set(CMAKE_BUILD_TYPE "RelWithDebInfo")
|
set(CMAKE_BUILD_TYPE "RelWithDebInfo")
|
||||||
endif()
|
endif()
|
||||||
message("CMAKE_BUILD_TYPE is ${CMAKE_BUILD_TYPE}")
|
message(STATUS "CMAKE_BUILD_TYPE is ${CMAKE_BUILD_TYPE}")
|
||||||
add_list_string_option(CMAKE_BUILD_TYPE "RelWithDebInfo" "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel." Debug Release RelWithDebInfo MinSizeRel)
|
add_list_string_option(CMAKE_BUILD_TYPE "RelWithDebInfo" "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel." Debug Release RelWithDebInfo MinSizeRel)
|
||||||
|
|
||||||
Message("Architecture is ${CMAKE_SYSTEM_PROCESSOR}")
|
|
||||||
# in case /proc/cpuinfo exists we want to inspect available Intrinsics
|
# in case /proc/cpuinfo exists we want to inspect available Intrinsics
|
||||||
# -so not to go always through SIMDE emulation
|
# -so not to go always through SIMDE emulation
|
||||||
# -so to avoid AVX512 instructions generation by gcc
|
# -so to avoid AVX512 instructions generation by gcc
|
||||||
if(EXISTS "/proc/cpuinfo")
|
execute_process(COMMAND uname -m OUTPUT_VARIABLE CPUARCH OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
file(STRINGS "/proc/cpuinfo" CPUINFO REGEX flags LIMIT_COUNT 1)
|
message(STATUS "CPUARCH ${CPUARCH}")
|
||||||
message("AVX512 is ${AVX512}")
|
if(EXISTS "/proc/cpuinfo")
|
||||||
message("AVX2 is ${AVX2}")
|
file(STRINGS "/proc/cpuinfo" CPUFLAGS REGEX flags LIMIT_COUNT 1)
|
||||||
# The following intrinsics are assumed to be available on any x86 system used to build the software (avx, f16c, fma, gnfi, mmx, pclmul, sse, sse2, sse3, xop)
|
else()
|
||||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -DSIMDE_X86_AVX_NATIVE -DSIMDE_X86_AVX_NATIVE -DSIMDE_X86_F16C_NATIVE -DSIMDE_X86_FMA_NATIVE -DSIMDE_X86_GFNI_NATIVE -DSIMDE_X86_MMX_NATIVE -DSIMDE_X86_PCLMUL_NATIVE -DSIMDE_X86_SSE2_NATIVE -DSIMDE_X86_SSE3_NATIVE -DSIMDE_X86_SSE_NATIVE -DSIMDE_X86_XOP_HAVE_COM_ -DSIMDE_X86_XOP_NATIVE")
|
message(WARNING "did not find /proc/cpuinfo -- not setting any x86-specific compilation variables")
|
||||||
if ("${AVX512}" STREQUAL "False")
|
endif()
|
||||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mno-avx512f -march=native")
|
|
||||||
else()
|
eval_boolean(AUTODETECT_AVX512 DEFINED CPUFLAGS AND CPUFLAGS MATCHES "avx512")
|
||||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -DSIMDE_X86_AVX512BW_NATIVE -DSIMDE_X86_AVX512F_NATIVE -DSIMDE_X86_AVX512VL_NATIVE -mavx512bw -march=skylake-avx512 -mtune=skylake-avx512")
|
add_boolean_option(AVX512 ${AUTODETECT_AVX512} "Whether AVX512 intrinsics is available on the host processor")
|
||||||
endif()
|
|
||||||
if (CPUINFO MATCHES "avx2" AND "${AVX2}" STREQUAL "True")
|
eval_boolean(AUTODETECT_AVX2 DEFINED CPUFLAGS AND CPUFLAGS MATCHES "avx2")
|
||||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -DSIMDE_X86_AVX2_NATIVE -DSIMDE_X86_VPCLMULQDQ_NATIVE")
|
add_boolean_option(AVX2 ${AUTODETECT_AVX2} "Whether AVX2 intrinsics is available on the host processor")
|
||||||
endif()
|
|
||||||
if (CPUINFO MATCHES "sse4_1")
|
if(${CPUARCH} STREQUAL "x86_64" AND DEFINED CPUFLAGS)
|
||||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -DSIMDE_X86_SSE4_1_NATIVE")
|
# The following intrinsics are assumed to be available on any x86 system
|
||||||
endif()
|
# (avx, f16c, fma, gnfi, mmx, pclmul, sse, sse2, sse3, xop)
|
||||||
if (CPUINFO MATCHES "sse4_2")
|
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -DSIMDE_X86_AVX_NATIVE -DSIMDE_X86_AVX_NATIVE -DSIMDE_X86_F16C_NATIVE -DSIMDE_X86_FMA_NATIVE -DSIMDE_X86_GFNI_NATIVE -DSIMDE_X86_MMX_NATIVE -DSIMDE_X86_PCLMUL_NATIVE -DSIMDE_X86_SSE2_NATIVE -DSIMDE_X86_SSE3_NATIVE -DSIMDE_X86_SSE_NATIVE -DSIMDE_X86_XOP_HAVE_COM_ -DSIMDE_X86_XOP_NATIVE")
|
||||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -DSIMDE_X86_SSE4_2_NATIVE")
|
message(STATUS "AVX512 intrinsics are ${AVX512}")
|
||||||
endif()
|
if(${AVX512})
|
||||||
if (CPUINFO MATCHES "ssse3")
|
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -DSIMDE_X86_AVX512BW_NATIVE -DSIMDE_X86_AVX512F_NATIVE -DSIMDE_X86_AVX512VL_NATIVE -mavx512bw -march=skylake-avx512 -mtune=skylake-avx512")
|
||||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -DSIMDE_X86_SSSE3_NATIVE")
|
else()
|
||||||
endif()
|
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mno-avx512f -march=native")
|
||||||
|
endif()
|
||||||
|
message(STATUS "AVX2 intrinsics are ${AVX2}")
|
||||||
|
if(${AVX2})
|
||||||
|
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -DSIMDE_X86_AVX2_NATIVE -DSIMDE_X86_VPCLMULQDQ_NATIVE")
|
||||||
|
endif()
|
||||||
|
if (CPUINFO MATCHES "sse4_1")
|
||||||
|
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -DSIMDE_X86_SSE4_1_NATIVE")
|
||||||
|
endif()
|
||||||
|
if(CPUINFO MATCHES "sse4_2")
|
||||||
|
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -DSIMDE_X86_SSE4_2_NATIVE")
|
||||||
|
endif()
|
||||||
|
if(CPUINFO MATCHES "ssse3")
|
||||||
|
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -DSIMDE_X86_SSSE3_NATIVE")
|
||||||
|
endif()
|
||||||
|
elseif(${CPUARCH} NOT STREQUAL "x86_64")
|
||||||
|
message(FATAL_ERROR "Cannot compile for CPU architecture ${CPUARCH}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -fno-var-tracking-assignments -march=native")
|
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -fno-var-tracking-assignments -march=native")
|
||||||
|
|
||||||
Message("C_FLAGS_PROCESSOR is ${C_FLAGS_PROCESSOR}")
|
|
||||||
|
|
||||||
#
|
|
||||||
# add autotools definitions that were maybe used!
|
# add autotools definitions that were maybe used!
|
||||||
|
|
||||||
add_definitions("-DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_FCNTL_H=1 -DHAVE_ARPA_INET_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_SYS_SOCKET_H=1 -DHAVE_STRERROR=1 -DHAVE_SOCKET=1 -DHAVE_MEMSET=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DHAVE_LIBSCTP")
|
add_definitions("-DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_FCNTL_H=1 -DHAVE_ARPA_INET_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_SYS_SOCKET_H=1 -DHAVE_STRERROR=1 -DHAVE_SOCKET=1 -DHAVE_MEMSET=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DHAVE_LIBSCTP")
|
||||||
|
|
||||||
set(commonOpts "-pipe -Wno-packed-bitfield-compat -fPIC -Wall -fno-strict-aliasing -rdynamic")
|
set(commonOpts "-pipe -Wno-packed-bitfield-compat -fPIC -Wall -fno-strict-aliasing -rdynamic")
|
||||||
|
|||||||
+4
-20
@@ -53,8 +53,6 @@ BUILD_COVERITY_SCAN=0
|
|||||||
DISABLE_HARDWARE_DEPENDENCY="False"
|
DISABLE_HARDWARE_DEPENDENCY="False"
|
||||||
CMAKE_BUILD_TYPE="RelWithDebInfo"
|
CMAKE_BUILD_TYPE="RelWithDebInfo"
|
||||||
CMAKE_CMD="$CMAKE"
|
CMAKE_CMD="$CMAKE"
|
||||||
AVX512="True"
|
|
||||||
AVX2="True"
|
|
||||||
BUILD_ECLIPSE=0
|
BUILD_ECLIPSE=0
|
||||||
NR="False"
|
NR="False"
|
||||||
OPTIONAL_LIBRARIES="telnetsrv enbscope uescope nrscope"
|
OPTIONAL_LIBRARIES="telnetsrv enbscope uescope nrscope"
|
||||||
@@ -159,7 +157,7 @@ Options:
|
|||||||
--noavx512
|
--noavx512
|
||||||
Disable AVX512 intrinsics whatever processor capability is
|
Disable AVX512 intrinsics whatever processor capability is
|
||||||
--noavx2
|
--noavx2
|
||||||
Disable AVX2 intrinsics if processor supports it or use SIMDE emulation
|
Disable AVX2 intrinsics whatever processor capability is
|
||||||
-k | --skip-shared-libraries
|
-k | --skip-shared-libraries
|
||||||
Skip build for shared libraries to reduce compilation time when building frequently for debugging purposes
|
Skip build for shared libraries to reduce compilation time when building frequently for debugging purposes
|
||||||
--ninja
|
--ninja
|
||||||
@@ -394,11 +392,11 @@ function main() {
|
|||||||
fi
|
fi
|
||||||
shift 2;;
|
shift 2;;
|
||||||
--noavx512)
|
--noavx512)
|
||||||
AVX512="False"
|
CMAKE_CMD="$CMAKE_CMD -DAVX512=OFF"
|
||||||
echo_info "Disabling AVX512 instructions"
|
echo_info "Disabling AVX512 instructions"
|
||||||
shift 1;;
|
shift 1;;
|
||||||
--noavx2)
|
--noavx2)
|
||||||
AVX2="False"
|
CMAKE_CMD="$CMAKE_CMD -DAVX2=OFF"
|
||||||
echo_info "Disabling AVX2 instructions"
|
echo_info "Disabling AVX2 instructions"
|
||||||
shift 1;;
|
shift 1;;
|
||||||
-k | --skip-shared-libraries)
|
-k | --skip-shared-libraries)
|
||||||
@@ -559,23 +557,9 @@ function main() {
|
|||||||
if [[ ${#CMAKE_C_FLAGS[@]} > 0 ]]; then CMAKE_CMD="$CMAKE_CMD -DCMAKE_C_FLAGS=\"${CMAKE_C_FLAGS[*]}\""; fi
|
if [[ ${#CMAKE_C_FLAGS[@]} > 0 ]]; then CMAKE_CMD="$CMAKE_CMD -DCMAKE_C_FLAGS=\"${CMAKE_C_FLAGS[*]}\""; fi
|
||||||
if [[ ${#CMAKE_CXX_FLAGS[@]} > 0 ]]; then CMAKE_CMD="$CMAKE_CMD -DCMAKE_CXX_FLAGS=\"${CMAKE_CXX_FLAGS[*]}\""; fi
|
if [[ ${#CMAKE_CXX_FLAGS[@]} > 0 ]]; then CMAKE_CMD="$CMAKE_CMD -DCMAKE_CXX_FLAGS=\"${CMAKE_CXX_FLAGS[*]}\""; fi
|
||||||
|
|
||||||
# if --noavx512 is not specified the AVX512 equals "True" by default
|
|
||||||
# override AVX512 to "False" if processor does not have avx512
|
|
||||||
# this avoids having to specify --noavx512 systematically
|
|
||||||
if [ -f /proc/cpuinfo ]; then
|
|
||||||
if grep -q avx512 /proc/cpuinfo
|
|
||||||
then
|
|
||||||
echo_info "Processor has avx512 intrinsics"
|
|
||||||
else
|
|
||||||
echo_info "Processor does not have avx512 intrinsics"
|
|
||||||
echo_info "Forcing AVX512 to False"
|
|
||||||
AVX512="False"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# for historical reasons we build in a subdirectory cmake_targets/XYZ/build,
|
# for historical reasons we build in a subdirectory cmake_targets/XYZ/build,
|
||||||
# e.g., cmake_targets/ran_build/build, hence the ../../..
|
# e.g., cmake_targets/ran_build/build, hence the ../../..
|
||||||
CMAKE_CMD="$CMAKE_CMD -DAVX512=\"${AVX512[*]}\" -DAVX2=\"${AVX2[*]}\" ../../.."
|
CMAKE_CMD="$CMAKE_CMD ../../.."
|
||||||
echo_info "running $CMAKE_CMD"
|
echo_info "running $CMAKE_CMD"
|
||||||
eval $CMAKE_CMD
|
eval $CMAKE_CMD
|
||||||
|
|
||||||
|
|||||||
@@ -96,3 +96,11 @@ macro(compile_asn1 asn1Source asn1cCmd ResultFlag)
|
|||||||
DEPENDS ${asn1Source}
|
DEPENDS ${asn1Source}
|
||||||
)
|
)
|
||||||
endmacro(compile_asn1)
|
endmacro(compile_asn1)
|
||||||
|
|
||||||
|
macro(eval_boolean VARIABLE)
|
||||||
|
if(${ARGN})
|
||||||
|
set(${VARIABLE} ON)
|
||||||
|
else()
|
||||||
|
set(${VARIABLE} OFF)
|
||||||
|
endif()
|
||||||
|
endmacro()
|
||||||
|
|||||||
Reference in New Issue
Block a user