diff --git a/CMake/VTKmCompilerOptimizations.cmake b/CMake/VTKmCompilerOptimizations.cmake index 67cd0fa1f..ed538d452 100644 --- a/CMake/VTKmCompilerOptimizations.cmake +++ b/CMake/VTKmCompilerOptimizations.cmake @@ -65,6 +65,8 @@ # Note: By default we use 'native' as the default option # # + +function(set_vectorization_flags_properties vec_levels_var) set(vec_levels none native) if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") @@ -72,9 +74,9 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") list(APPEND vec_levels avx) #common flags for the avx instructions for the gcc compiler - set_property(GLOBAL PROPERTY VTKm_NATIVE_FLAGS -march=native) - set_property(GLOBAL PROPERTY VTKm_AVX_FLAGS -mavx) - set_property(GLOBAL PROPERTY VTKm_AVX2_FLAGS -mf16c -mavx2 -mfma -mlzcnt -mbmi -mbmi2) + set(native_flags -march=native) + set(avx_flags -mavx) + set(avx2_flags ${avx_flags} -mf16c -mavx2 -mfma -mlzcnt -mbmi -mbmi2) if (CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 4.7 OR CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.7) @@ -83,24 +85,24 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") elseif(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.1) #if GNU is less than 5.1 you get avx, avx2, and some avx512 list(APPEND vec_levels avx2 avx512) - set_property(GLOBAL PROPERTY VTKm_AVX512_FLAGS -mavx512f -mavx512pf -mavx512er -mavx512cd) + set(avx512_flags ${avx2_flags} -mavx512f -mavx512pf -mavx512er -mavx512cd) else() #if GNU is 5.1+ you get avx, avx2, and more avx512 list(APPEND vec_levels avx2 avx512) - set_property(GLOBAL PROPERTY VTKm_AVX512_FLAGS -mavx512f -mavx512pf -mavx512er -mavx512cd -mavx512vl -mavx512bw -mavx512dq -mavx512ifma -mavx512vbmi) + set(avx512_flags ${avx2_flags} -mavx512f -mavx512pf -mavx512er -mavx512cd -mavx512vl -mavx512bw -mavx512dq -mavx512ifma -mavx512vbmi) endif() elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") list(APPEND vec_levels avx avx2 avx512) - set_property(GLOBAL PROPERTY VTKm_NATIVE_FLAGS -march=native) - set_property(GLOBAL PROPERTY VTKm_AVX_FLAGS -mavx) - set_property(GLOBAL PROPERTY VTKm_AVX2_FLAGS -mf16c -mavx2 -mfma -mlzcnt -mbmi -mbmi2) - set_property(GLOBAL PROPERTY VTKm_AVX512_FLAGS -mavx512) + set(native_flags -march=native) + set(avx_flags -mavx) + set(avx2_flags ${avx_flags} -mf16c -mavx2 -mfma -mlzcnt -mbmi -mbmi2) + set(avx512_flags ${avx2_flags} -mavx512) elseif(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") #While Clang support AVX512, no version of AppleClang has that support yet list(APPEND vec_levels avx avx2) - set_property(GLOBAL PROPERTY VTKm_NATIVE_FLAGS -march=native) - set_property(GLOBAL PROPERTY VTKm_AVX_FLAGS -mavx) - set_property(GLOBAL PROPERTY VTKm_AVX2_FLAGS -mf16c -mavx2 -mfma -mlzcnt -mbmi -mbmi2) + set(native_flags -march=native) + set(avx_flags -mavx) + set(avx2_flags ${avx_flags} -mf16c -mavx2 -mfma -mlzcnt -mbmi -mbmi2) elseif(CMAKE_CXX_COMPILER_ID STREQUAL "PGI") #I can't find documentation to explicitly state the level of vectorization #support I want from the PGI compiler @@ -109,18 +111,29 @@ elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") #Intel 15.X is the first version with avx512 #Intel 16.X has way better vector generation compared to 15.X though - set_property(GLOBAL PROPERTY VTKm_NATIVE_FLAGS -xHost) - set_property(GLOBAL PROPERTY VTKm_AVX_FLAGS -xAVX) - set_property(GLOBAL PROPERTY VTKm_AVX2_FLAGS -xCORE-AVX2) + set(native_flags -xHost) + set(avx_flags -xAVX) + set(avx2_flags -xCORE-AVX2) if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 15.0) list(APPEND vec_levels avx avx2) else() list(APPEND vec_levels avx avx2 avx512) - set_property(GLOBAL PROPERTY VTKm_AVX512_FLAGS -xCORE-AVX512) + set(avx512_flags -xCORE-AVX512) endif() endif() +set_property(GLOBAL PROPERTY VTKm_NATIVE_FLAGS ${native_flags}) +set_property(GLOBAL PROPERTY VTKm_AVX_FLAGS ${avx_flags}) +set_property(GLOBAL PROPERTY VTKm_AVX2_FLAGS ${avx2_flags}) +set_property(GLOBAL PROPERTY VTKm_AVX512_FLAGS ${avx512_flags}) +set(${vec_levels_var} ${vec_levels} PARENT_SCOPE) + +endfunction() # set_vectorization_flags_properties + + +set_vectorization_flags_properties(vec_levels) + # # Now that we have set up what levels the compiler lets setup the CMake option # We use a combo box style property, so that ccmake and cmake-gui have a @@ -139,14 +152,9 @@ if(VTKm_Vectorization STREQUAL "native") elseif(VTKm_Vectorization STREQUAL "avx") get_property(flags GLOBAL PROPERTY VTKm_AVX_FLAGS) elseif(VTKm_Vectorization STREQUAL "avx2") - get_property(avx GLOBAL PROPERTY VTKm_AVX_FLAGS) - get_property(avx2 GLOBAL PROPERTY VTKm_AVX2_FLAGS) - set(flags ${avx} ${avx2}) + get_property(flags GLOBAL PROPERTY VTKm_AVX2_FLAGS) elseif(VTKm_Vectorization STREQUAL "avx512") - get_property(avx GLOBAL PROPERTY VTKm_AVX_FLAGS) - get_property(avx2 GLOBAL PROPERTY VTKm_AVX2_FLAGS) - get_property(avx512 GLOBAL PROPERTY VTKm_AVX512_FLAGS) - set(flags ${avx} ${avx2} ${avx512}) + get_property(flags GLOBAL PROPERTY VTKm_AVX512_FLAGS) endif() #guard against adding the flags multiple times, which happens when multiple