Skip to content
Snippets Groups Projects
Commit 5271e619 authored by Benjamin Cumming's avatar Benjamin Cumming
Browse files

improve support for vectorization in CMake

* the user can specify one of {none,AVX,AVX2,KNL} as
  targets for vectorization
* if modcc is available in PATH it will be used, which
  makes cross compilation easier
* a new flag USE_OPTIMIZED_KERNELS can be set to
  generate optimized kernels from the modcc compiler
  (equivalent to adding -O flag to modcc)
parent 3b93faa0
No related branches found
No related tags found
No related merge requests found
...@@ -51,7 +51,7 @@ if(WITH_MPI) ...@@ -51,7 +51,7 @@ if(WITH_MPI)
endif() endif()
# Profiler support # Profiler support
set(WITH_PROFILING OFF CACHE BOOL "use built in profiling of miniapp" ) set(WITH_PROFILING OFF CACHE BOOL "use built-in profiling of miniapp" )
if(WITH_PROFILING) if(WITH_PROFILING)
add_definitions(-DWITH_PROFILING) add_definitions(-DWITH_PROFILING)
endif() endif()
...@@ -62,28 +62,19 @@ if(SYSTEM_CRAY) ...@@ -62,28 +62,19 @@ if(SYSTEM_CRAY)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -dynamic") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -dynamic")
endif() endif()
# KNL target # vectorization target
set(TARGET_KNL OFF CACHE BOOL "target Intel KNL architecture") set(VECTORIZE_TARGET "none" CACHE STRING "CPU target for vectorization {KNL,AVX,AVX2}")
if(TARGET_KNL)
if(VECTORIZE_TARGET STREQUAL "KNL")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXXOPT_KNL}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXXOPT_KNL}")
elseif(VECTORIZE_TARGET STREQUAL "AVX")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXXOPT_AVX}")
elseif(VECTORIZE_TARGET STREQUAL "AVX2")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXXOPT_AVX2}")
endif() endif()
# vectorization # whether to generate optimized kernels from NMODL
set(TARGET_VECTORIZE OFF CACHE BOOL "generate optimized code that vectorizes with the Intel compiler") set(USE_OPTIMIZED_KERNELS OFF CACHE BOOL "generate optimized code that vectorizes with the Intel compiler")
# targets for extermal dependencies
include(ExternalProject)
externalproject_add(modparser
PREFIX ${CMAKE_BINARY_DIR}/external
CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/external"
"-DCMAKE_CXX_FLAGS=${SAVED_CXX_FLAGS}"
"-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
BINARY_DIR "${CMAKE_BINARY_DIR}/external/modparser"
STAMP_DIR "${CMAKE_BINARY_DIR}/external/"
TMP_DIR "${CMAKE_BINARY_DIR}/external/tmp"
SOURCE_DIR "${CMAKE_SOURCE_DIR}/external/modparser"
)
include_directories(${CMAKE_SOURCE_DIR}/external) include_directories(${CMAKE_SOURCE_DIR}/external)
include_directories(${CMAKE_SOURCE_DIR}/external/tclap/include) include_directories(${CMAKE_SOURCE_DIR}/external/tclap/include)
...@@ -91,7 +82,6 @@ include_directories(${CMAKE_SOURCE_DIR}/include) ...@@ -91,7 +82,6 @@ include_directories(${CMAKE_SOURCE_DIR}/include)
include_directories(${CMAKE_SOURCE_DIR}/src) include_directories(${CMAKE_SOURCE_DIR}/src)
include_directories(${CMAKE_SOURCE_DIR}/miniapp) include_directories(${CMAKE_SOURCE_DIR}/miniapp)
include_directories(${CMAKE_SOURCE_DIR}) include_directories(${CMAKE_SOURCE_DIR})
if( "${WITH_TBB}" STREQUAL "ON" ) if( "${WITH_TBB}" STREQUAL "ON" )
include_directories(${TBB_INCLUDE_DIRS}) include_directories(${TBB_INCLUDE_DIRS})
endif() endif()
......
...@@ -17,8 +17,9 @@ if(${CMAKE_CXX_COMPILER_ID} MATCHES "GNU") ...@@ -17,8 +17,9 @@ if(${CMAKE_CXX_COMPILER_ID} MATCHES "GNU")
# compiler flags for generating KNL-specific AVX512 instructions # compiler flags for generating KNL-specific AVX512 instructions
# supported in gcc 4.9.x and later # supported in gcc 4.9.x and later
#set(CXXOPT_KNL "-mavx512f")
set(CXXOPT_KNL "-march=knl") set(CXXOPT_KNL "-march=knl")
set(CXXOPT_AVX "-mavx")
set(CXXOPT_AVX2 "-march=core-avx2")
endif() endif()
if(${CMAKE_CXX_COMPILER_ID} MATCHES "Intel") if(${CMAKE_CXX_COMPILER_ID} MATCHES "Intel")
...@@ -29,5 +30,7 @@ if(${CMAKE_CXX_COMPILER_ID} MATCHES "Intel") ...@@ -29,5 +30,7 @@ if(${CMAKE_CXX_COMPILER_ID} MATCHES "Intel")
# compiler flags for generating KNL-specific AVX512 instructions # compiler flags for generating KNL-specific AVX512 instructions
set(CXXOPT_KNL "-xMIC-AVX512") set(CXXOPT_KNL "-xMIC-AVX512")
set(CXXOPT_AVX "-mavx")
set(CXXOPT_AVX2 "-march=core-avx2")
endif() endif()
set(mechanisms pas hh expsyn exp2syn)
set(modcc "${CMAKE_BINARY_DIR}/external/bin/modcc") # Only build modcc if it has not already been installed.
# This is useful if cross compiling for KNL, when it is not desirable to compile
# modcc with the same flags that are used for the KNL target.
find_program(MODCC_BIN modcc)
set(modcc "${MODCC_BIN}")
set(use_external_modcc OFF BOOL)
# the modcc executable was not found, so build our own copy
if(MODCC_BIN STREQUAL "MODCC_BIN-NOTFOUND")
include(ExternalProject)
externalproject_add(modparser
PREFIX ${CMAKE_BINARY_DIR}/external
CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/external"
"-DCMAKE_CXX_FLAGS=${SAVED_CXX_FLAGS}"
"-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
BINARY_DIR "${CMAKE_BINARY_DIR}/external/modparser"
STAMP_DIR "${CMAKE_BINARY_DIR}/external/"
TMP_DIR "${CMAKE_BINARY_DIR}/external/tmp"
SOURCE_DIR "${CMAKE_SOURCE_DIR}/external/modparser"
)
# Set up environment to use the version of modcc that is compiled
# as the ExternalProject above.
set(use_external_modcc ON)
set(modcc "${CMAKE_BINARY_DIR}/external/bin/modcc")
endif()
# the list of built-in mechanisms to be provided by default
set(mechanisms pas hh expsyn exp2syn)
# set the flags for the modcc compiler that converts NMODL
# files to C++/CUDA source.
set(modcc_flags "-t cpu") set(modcc_flags "-t cpu")
if(TARGET_VECTORIZE) if(USE_OPTIMIZED_KERNELS) # generate optimized kernels
set(modcc_flags ${modcc_flags} -O) set(modcc_flags ${modcc_flags} -O)
endif() endif()
# generate source for each mechanism
foreach(mech ${mechanisms}) foreach(mech ${mechanisms})
set(mod "${CMAKE_CURRENT_SOURCE_DIR}/mod/${mech}.mod") set(mod "${CMAKE_CURRENT_SOURCE_DIR}/mod/${mech}.mod")
set(hpp "${CMAKE_CURRENT_SOURCE_DIR}/${mech}.hpp") set(hpp "${CMAKE_CURRENT_SOURCE_DIR}/${mech}.hpp")
add_custom_command(OUTPUT "${hpp}" if(use_external_modcc)
DEPENDS modparser "${mod}" add_custom_command(
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" OUTPUT "${hpp}"
COMMAND ${modcc} ${modcc_flags} ${mod} -o ${hpp}) WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
COMMAND ${modcc} ${modcc_flags} ${mod} -o ${hpp}
)
else()
add_custom_command(
OUTPUT "${hpp}"
DEPENDS modparser "${mod}"
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
COMMAND ${modcc} ${modcc_flags} ${mod} -o ${hpp}
)
endif()
set_source_files_properties("${hpp}" PROPERTIES GENERATED TRUE) set_source_files_properties("${hpp}" PROPERTIES GENERATED TRUE)
list(APPEND all_mod_hpps "${hpp}") list(APPEND all_mod_hpps "${hpp}")
endforeach() endforeach()
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment