diff --git a/CMakeLists.txt b/CMakeLists.txt index 91b0a1866ad4835bbdc3db6aec2a8c91a39770a9..041c025c3bd1725bcecda9ebb02d959ff19cff07 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,7 +51,7 @@ if(WITH_MPI) endif() # 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) add_definitions(-DWITH_PROFILING) endif() @@ -62,28 +62,19 @@ if(SYSTEM_CRAY) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -dynamic") endif() -# KNL target -set(TARGET_KNL OFF CACHE BOOL "target Intel KNL architecture") -if(TARGET_KNL) +# vectorization target +set(VECTORIZE_TARGET "none" CACHE STRING "CPU target for vectorization {KNL,AVX,AVX2}") + +if(VECTORIZE_TARGET STREQUAL "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() -# vectorization -set(TARGET_VECTORIZE 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" - ) - +# whether to generate optimized kernels from NMODL +set(USE_OPTIMIZED_KERNELS OFF CACHE BOOL "generate optimized code that vectorizes with the Intel compiler") include_directories(${CMAKE_SOURCE_DIR}/external) include_directories(${CMAKE_SOURCE_DIR}/external/tclap/include) @@ -91,7 +82,6 @@ include_directories(${CMAKE_SOURCE_DIR}/include) include_directories(${CMAKE_SOURCE_DIR}/src) include_directories(${CMAKE_SOURCE_DIR}/miniapp) include_directories(${CMAKE_SOURCE_DIR}) - if( "${WITH_TBB}" STREQUAL "ON" ) include_directories(${TBB_INCLUDE_DIRS}) endif() diff --git a/cmake/CompilerOptions.cmake b/cmake/CompilerOptions.cmake index 6dc09b961cc6a71ce69b1bf9cba5d6821e6949e8..c92c14c45eea9f6969c6395bc67964fa37f16b30 100644 --- a/cmake/CompilerOptions.cmake +++ b/cmake/CompilerOptions.cmake @@ -17,8 +17,9 @@ if(${CMAKE_CXX_COMPILER_ID} MATCHES "GNU") # compiler flags for generating KNL-specific AVX512 instructions # supported in gcc 4.9.x and later - #set(CXXOPT_KNL "-mavx512f") set(CXXOPT_KNL "-march=knl") + set(CXXOPT_AVX "-mavx") + set(CXXOPT_AVX2 "-march=core-avx2") endif() 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 set(CXXOPT_KNL "-xMIC-AVX512") + set(CXXOPT_AVX "-mavx") + set(CXXOPT_AVX2 "-march=core-avx2") endif() diff --git a/mechanisms/CMakeLists.txt b/mechanisms/CMakeLists.txt index 9dded83451d6f5f61721b5fe316447988226f1e4..ace3ccda304be110d1cc65b215986759c88647b3 100644 --- a/mechanisms/CMakeLists.txt +++ b/mechanisms/CMakeLists.txt @@ -1,19 +1,58 @@ -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") -if(TARGET_VECTORIZE) - set(modcc_flags ${modcc_flags} -O) +if(USE_OPTIMIZED_KERNELS) # generate optimized kernels + set(modcc_flags ${modcc_flags} -O) endif() +# generate source for each mechanism foreach(mech ${mechanisms}) set(mod "${CMAKE_CURRENT_SOURCE_DIR}/mod/${mech}.mod") set(hpp "${CMAKE_CURRENT_SOURCE_DIR}/${mech}.hpp") - add_custom_command(OUTPUT "${hpp}" - DEPENDS modparser "${mod}" - WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" - COMMAND ${modcc} ${modcc_flags} ${mod} -o ${hpp}) + if(use_external_modcc) + add_custom_command( + OUTPUT "${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) list(APPEND all_mod_hpps "${hpp}") endforeach()