Fix how the vectorization flags are specified

For intel compilers, specifying multiple flags will result in warnings and
the last flag overrides previous flags.
This commit is contained in:
Sujin Philip 2016-02-18 17:05:20 -05:00
parent 8589df3df8
commit 0900e0c06c

@ -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