From 814045201fc211c8d1ac021b17013f5a0a06a9d5 Mon Sep 17 00:00:00 2001 From: Konstantinos Margaritis Date: Mon, 15 Feb 2021 13:46:30 +0200 Subject: [PATCH] add BUILD_AVX2 definition, enable non-AVX2 building selectively --- CMakeLists.txt | 128 +++++++++++++++++++++------------------- cmake/arch.cmake | 15 +++-- cmake/config.h.in | 3 + src/util/arch/x86/x86.h | 4 +- unit/CMakeLists.txt | 7 ++- 5 files changed, 87 insertions(+), 70 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3eeeb528..0c9b30fb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1190,7 +1190,7 @@ if (NOT FAT_RUNTIME) set(hs_exec_SRCS ${hs_exec_SRCS} ${hs_exec_common_SRCS}) - if (HAVE_AVX2) + if (BUILD_AVX2) set(hs_exec_SRCS ${hs_exec_SRCS} ${hs_exec_avx2_SRCS}) endif() @@ -1232,66 +1232,68 @@ else (FAT_RUNTIME) COMPILE_FLAGS "-Wno-unused-parameter -Wno-unused-function ${DISPATCHER_DEFINE}") if (BUILD_STATIC_LIBS) - add_library(hs_exec_core2 OBJECT ${hs_exec_SRCS}) - list(APPEND RUNTIME_LIBS $) - set_target_properties(hs_exec_core2 PROPERTIES - COMPILE_FLAGS "-march=core2" - RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} core2 ${CMAKE_MODULE_PATH}/keep.syms.in" - ) + add_library(hs_exec_core2 OBJECT ${hs_exec_SRCS}) + list(APPEND RUNTIME_LIBS $) + set_target_properties(hs_exec_core2 PROPERTIES + COMPILE_FLAGS "-march=core2" + RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} core2 ${CMAKE_MODULE_PATH}/keep.syms.in" + ) - add_library(hs_exec_corei7 OBJECT ${hs_exec_SRCS}) - list(APPEND RUNTIME_LIBS $) - set_target_properties(hs_exec_corei7 PROPERTIES - COMPILE_FLAGS "-march=corei7" - RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} corei7 ${CMAKE_MODULE_PATH}/keep.syms.in" - ) + add_library(hs_exec_corei7 OBJECT ${hs_exec_SRCS}) + list(APPEND RUNTIME_LIBS $) + set_target_properties(hs_exec_corei7 PROPERTIES + COMPILE_FLAGS "-march=corei7" + RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} corei7 ${CMAKE_MODULE_PATH}/keep.syms.in" + ) - add_library(hs_exec_avx2 OBJECT ${hs_exec_SRCS} ${hs_exec_avx2_SRCS}) - list(APPEND RUNTIME_LIBS $) - set_target_properties(hs_exec_avx2 PROPERTIES - COMPILE_FLAGS "-march=core-avx2" - RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} avx2 ${CMAKE_MODULE_PATH}/keep.syms.in" - ) - if (BUILD_AVX512) - add_library(hs_exec_avx512 OBJECT ${hs_exec_SRCS} ${hs_exec_avx2_SRCS}) - list(APPEND RUNTIME_LIBS $) - set_target_properties(hs_exec_avx512 PROPERTIES - COMPILE_FLAGS "${SKYLAKE_FLAG}" - RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} avx512 ${CMAKE_MODULE_PATH}/keep.syms.in" - ) - endif (BUILD_AVX512) - if (BUILD_AVX512VBMI) - add_library(hs_exec_avx512vbmi OBJECT ${hs_exec_SRCS} ${hs_exec_avx2_SRCS}) - list(APPEND RUNTIME_LIBS $) - set_target_properties(hs_exec_avx512vbmi PROPERTIES - COMPILE_FLAGS "${ICELAKE_FLAG}" - RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} avx512vbmi ${CMAKE_MODULE_PATH}/keep.syms.in" - ) - endif (BUILD_AVX512VBMI) + if (BUILD_AVX2) + add_library(hs_exec_avx2 OBJECT ${hs_exec_SRCS} ${hs_exec_avx2_SRCS}) + list(APPEND RUNTIME_LIBS $) + set_target_properties(hs_exec_avx2 PROPERTIES + COMPILE_FLAGS "-march=core-avx2" + RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} avx2 ${CMAKE_MODULE_PATH}/keep.syms.in" + ) + endif (BUILD_AVX2) + if (BUILD_AVX512) + add_library(hs_exec_avx512 OBJECT ${hs_exec_SRCS} ${hs_exec_avx2_SRCS}) + list(APPEND RUNTIME_LIBS $) + set_target_properties(hs_exec_avx512 PROPERTIES + COMPILE_FLAGS "${SKYLAKE_FLAG}" + RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} avx512 ${CMAKE_MODULE_PATH}/keep.syms.in" + ) + endif (BUILD_AVX512) + if (BUILD_AVX512VBMI) + add_library(hs_exec_avx512vbmi OBJECT ${hs_exec_SRCS} ${hs_exec_avx2_SRCS}) + list(APPEND RUNTIME_LIBS $) + set_target_properties(hs_exec_avx512vbmi PROPERTIES + COMPILE_FLAGS "${ICELAKE_FLAG}" + RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} avx512vbmi ${CMAKE_MODULE_PATH}/keep.syms.in" + ) + endif (BUILD_AVX512VBMI) - add_library(hs_exec_common OBJECT - ${hs_exec_common_SRCS} - src/dispatcher.c - ) + add_library(hs_exec_common OBJECT + ${hs_exec_common_SRCS} + src/dispatcher.c + ) - # hs_version.c is added explicitly to avoid some build systems that refuse to - # create a lib without any src (I'm looking at you Xcode) + # hs_version.c is added explicitly to avoid some build systems that refuse to + # create a lib without any src (I'm looking at you Xcode) - add_library(hs_runtime STATIC src/hs_version.c - $ - ${RUNTIME_LIBS}) - set_target_properties(hs_runtime PROPERTIES LINKER_LANGUAGE C) - add_library(hs_compile OBJECT ${hs_compile_SRCS}) - if (ARCH_IA32) - set_target_properties(hs_exec_common PROPERTIES COMPILE_FLAGS "-mssse3") - set_target_properties(hs_compile PROPERTIES COMPILE_FLAGS "-mssse3") - endif (ARCH_IA32) + add_library(hs_runtime STATIC src/hs_version.c + $ + ${RUNTIME_LIBS}) + set_target_properties(hs_runtime PROPERTIES LINKER_LANGUAGE C) + add_library(hs_compile OBJECT ${hs_compile_SRCS}) + if (ARCH_IA32) + set_target_properties(hs_exec_common PROPERTIES COMPILE_FLAGS "-mssse3") + set_target_properties(hs_compile PROPERTIES COMPILE_FLAGS "-mssse3") + endif (ARCH_IA32) - # we want the static lib for testing - add_library(hs STATIC src/hs_version.c src/hs_valid_platform.c - $ - $ - ${RUNTIME_LIBS}) + # we want the static lib for testing + add_library(hs STATIC src/hs_version.c src/hs_valid_platform.c + $ + $ + ${RUNTIME_LIBS}) endif (BUILD_STATIC_LIBS) @@ -1313,14 +1315,16 @@ else (FAT_RUNTIME) POSITION_INDEPENDENT_CODE TRUE RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} corei7 ${CMAKE_MODULE_PATH}/keep.syms.in" ) - add_library(hs_exec_shared_avx2 OBJECT ${hs_exec_SRCS} ${hs_exec_avx2_SRCS}) - list(APPEND RUNTIME_SHLIBS $) - set_target_properties(hs_exec_shared_avx2 PROPERTIES - COMPILE_FLAGS "-march=core-avx2" - POSITION_INDEPENDENT_CODE TRUE - RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} avx2 ${CMAKE_MODULE_PATH}/keep.syms.in" - ) + if (BUILD_AVX2) + add_library(hs_exec_shared_avx2 OBJECT ${hs_exec_SRCS} ${hs_exec_avx2_SRCS}) + list(APPEND RUNTIME_SHLIBS $) + set_target_properties(hs_exec_shared_avx2 PROPERTIES + COMPILE_FLAGS "-march=core-avx2" + POSITION_INDEPENDENT_CODE TRUE + RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} avx2 ${CMAKE_MODULE_PATH}/keep.syms.in" + ) + endif (BUILD_AVX2) if (BUILD_AVX512) add_library(hs_exec_shared_avx512 OBJECT ${hs_exec_SRCS} ${hs_exec_avx2_SRCS}) list(APPEND RUNTIME_SHLIBS $) diff --git a/cmake/arch.cmake b/cmake/arch.cmake index b0930728..691861d6 100644 --- a/cmake/arch.cmake +++ b/cmake/arch.cmake @@ -28,6 +28,9 @@ if (BUILD_AVX512VBMI) endif () if (FAT_RUNTIME) + if (NOT DEFINED(BUILD_AVX2)) + set(BUILD_AVX2 TRUE) + endif () # test the highest level microarch to make sure everything works if (BUILD_AVX512) if (BUILD_AVX512VBMI) @@ -35,8 +38,10 @@ if (FAT_RUNTIME) else () set (CMAKE_REQUIRED_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_C_FLAGS} ${SKYLAKE_FLAG}") endif (BUILD_AVX512VBMI) - else () + elseif (BUILD_AVX2) set (CMAKE_REQUIRED_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_C_FLAGS} -march=core-avx2") + elseif () + set (CMAKE_REQUIRED_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_C_FLAGS} -march=core-i7") endif () else (NOT FAT_RUNTIME) # if not fat runtime, then test given cflags @@ -99,23 +104,23 @@ if (FAT_RUNTIME) if ((ARCH_IA32 OR ARCH_X86_64) AND NOT HAVE_SSSE3) message(FATAL_ERROR "SSSE3 support required to build fat runtime") endif () - if ((ARCH_IA32 OR ARCH_X86_64) AND NOT HAVE_AVX2) + if ((ARCH_IA32 OR ARCH_X86_64) AND BUILD_AVX2 AND NOT HAVE_AVX2) message(FATAL_ERROR "AVX2 support required to build fat runtime") endif () if ((ARCH_IA32 OR ARCH_X86_64) AND BUILD_AVX512 AND NOT HAVE_AVX512) message(FATAL_ERROR "AVX512 support requested but not supported") endif () - if (BUILD_AVX512VBMI AND NOT HAVE_AVX512VBMI) + if ((ARCH_IA32 OR ARCH_X86_64) AND BUILD_AVX512VBMI AND NOT HAVE_AVX512VBMI) message(FATAL_ERROR "AVX512VBMI support requested but not supported") endif () else (NOT FAT_RUNTIME) - if ((ARCH_IA32 OR ARCH_X86_64) AND NOT HAVE_AVX2) + if ((ARCH_IA32 OR ARCH_X86_64) AND NOT BUILD_AVX2) message(STATUS "Building without AVX2 support") endif () if ((ARCH_IA32 OR ARCH_X86_64) AND NOT HAVE_AVX512) message(STATUS "Building without AVX512 support") endif () - if (ARCH_IA32 OR ARCH_X86_64 AND NOT HAVE_AVX512VBMI) + if ((ARCH_IA32 OR ARCH_X86_64) AND NOT HAVE_AVX512VBMI) message(STATUS "Building without AVX512VBMI support") endif () if ((ARCH_IA32 OR ARCH_X86_64) AND NOT HAVE_SSSE3) diff --git a/cmake/config.h.in b/cmake/config.h.in index f974c0ad..0de8cca2 100644 --- a/cmake/config.h.in +++ b/cmake/config.h.in @@ -27,6 +27,9 @@ /* Define if building "fat" runtime. */ #cmakedefine FAT_RUNTIME +/* Define if building AVX2 in the fat runtime. */ +#cmakedefine BUILD_AVX2 + /* Define if building AVX-512 in the fat runtime. */ #cmakedefine BUILD_AVX512 diff --git a/src/util/arch/x86/x86.h b/src/util/arch/x86/x86.h index 8126f14a..dae08149 100644 --- a/src/util/arch/x86/x86.h +++ b/src/util/arch/x86/x86.h @@ -48,12 +48,12 @@ #define HAVE_SIMD_128_BITS #endif -#if defined(__AVX__) +#if defined(__AVX__) && defined(BUILD_AVX2) #define HAVE_AVX #define HAVE_SIMD_256_BITS #endif -#if defined(__AVX2__) +#if defined(__AVX2__) && defined(BUILD_AVX2) #define HAVE_AVX2 #define HAVE_SIMD_256_BITS #endif diff --git a/unit/CMakeLists.txt b/unit/CMakeLists.txt index b0706fa8..a16042fe 100644 --- a/unit/CMakeLists.txt +++ b/unit/CMakeLists.txt @@ -93,7 +93,6 @@ set(unit_internal_SOURCES internal/insertion_ordered.cpp internal/lbr.cpp internal/limex_nfa.cpp - internal/masked_move.cpp internal/multi_bit.cpp internal/multi_bit_compress.cpp internal/nfagraph_common.h @@ -128,6 +127,12 @@ set(unit_internal_SOURCES internal/vermicelli.cpp internal/main.cpp ) +if (BUILD_AVX2) +set(unit_internal_SOURCES + ${unit_internal_SOURCES} + internal/masked_move.cpp + ) +endif(BUILD_AVX2) if(WIN32 AND (BUILD_STATIC_AND_SHARED OR BUILD_SHARED_LIBS)) add_executable(unit-internal ${unit_internal_SOURCES} $ $)