-
Fixes #152 * Remove OpenMP back end implementation. * Remove CMake options for OpenMP. * Simplify the threading model selection code in CMake. * Remove Extrae benchmarking scripts, which require OpenMP.
5a6f230e
CMakeLists.txt 9.73 KiB
cmake_minimum_required(VERSION 2.8)
# project info
project(cell_algorithms)
enable_language(CXX)
# Hide warnings about mixing old and new signatures for target_link_libraries.
# These can't be avoided, because the FindCUDA packed provided by CMake uses
# the old signature, while other packages use the new signature.
cmake_policy(SET CMP0023 OLD)
# save incoming CXX flags for forwarding to modcc external project
set(SAVED_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
# compilation flags
set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
include("CompilerOptions")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXXOPT_DEBUG} ${CXXOPT_CXX11} ${CXXOPT_PTHREAD} ${CXXOPT_WALL}")
# this generates a .json file with full compilation command for each file
set(CMAKE_EXPORT_COMPILE_COMMANDS "YES")
# generated .a and .so go into /lib
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
#----------------------------------------------------------
# Option to enable assertions
#----------------------------------------------------------
option(NMC_WITH_ASSERTIONS "enable EXPECTS() assertions in code" OFF)
if(NMC_WITH_ASSERTIONS)
add_definitions("-DNMC_HAVE_ASSERTIONS")
endif()
#----------------------------------------------------------
# Option to enable traces
#----------------------------------------------------------
option(NMC_WITH_TRACE "enable TRACE() macros in code" OFF)
if(NMC_WITH_TRACE)
add_definitions("-DNMC_HAVE_TRACE")
endif()
#----------------------------------------------------------
# Option to disable auto running of modcc compiler
#----------------------------------------------------------
option(NMC_AUTO_RUN_MODCC_ON_CHANGES
"Rerun modcc compiler whenever *.mod file or modcc compiler change" ON)
#----------------------------------------------------------
# prepare list of libraries/includes needed by external libs
#----------------------------------------------------------
set(EXTERNAL_LIBRARIES "")
set(EXTERNAL_INCLUDES "")
#----------------------------------------------------------
# Threading model selection
#----------------------------------------------------------
set(NMC_THREADING_MODEL "serial" CACHE STRING "set the threading model, one of serial/tbb/cthread")
set_property(CACHE NMC_THREADING_MODEL PROPERTY STRINGS serial tbb cthread)
if(NMC_THREADING_MODEL MATCHES "tbb")
find_package(TBB REQUIRED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TBB_DEFINITIONS}")
add_definitions(-DNMC_HAVE_TBB)
set(NMC_WITH_TBB TRUE)
list(APPEND EXTERNAL_LIBRARIES ${TBB_LIBRARIES})
list(APPEND EXTERNAL_INCLUDES ${TBB_INCLUDE_DIRS})
elseif(NMC_THREADING_MODEL MATCHES "cthread")
find_package(Threads REQUIRED)
add_definitions(-DNMC_HAVE_CTHREAD)
set(NMC_WITH_CTHREAD TRUE)
list(APPEND EXTERNAL_LIBRARIES ${CMAKE_THREAD_LIBS_INIT})
if(CMAKE_USE_PTHREADS_INIT)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
endif()
endif()
#----------------------------------------------------------
# libunwind for pretty printing stack traces
#----------------------------------------------------------
find_package(Unwind)
if(UNWIND_FOUND)
add_definitions(-DWITH_UNWIND)
include_directories(${UNWIND_INCLUDE_DIR})
list(APPEND EXTERNAL_LIBRARIES ${UNWIND_LIBRARIES})
endif()
#----------------------------------------------------------
# CUDA support
#----------------------------------------------------------
option(NMC_WITH_CUDA "use CUDA for GPU offload" OFF)
if(NMC_WITH_CUDA)
find_package(CUDA REQUIRED)
# Turn off annoying and incorrect warnings generated in the JSON file.
# We also work around the same issue with the intel compiler.
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS};-Xcudafe \"--diag_suppress=not_used_in_template_function_params\";-Xcudafe \"--diag_suppress=cast_to_qualified_type\")
# set the CUDA target specfic flags
# code regions protected by NMC_HAVE_CUDA should only be available to the CUDA
# compiler, which regions protected by NMC_HAVE_GPU are visible to both host
# and device compiler when targetting GPU.
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS};-DNMC_HAVE_CUDA)
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS};-DNMC_HAVE_GPU)
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS};-arch=sm_60)
add_definitions(-DNMC_HAVE_GPU)
include_directories(SYSTEM ${CUDA_INCLUDE_DIRS})
list(APPEND EXTERNAL_LIBRARIES ${CUDA_LIBRARIES})
endif()
#----------------------------------------------------------
# Cray/BGQ/Generic Linux/other flag?
#----------------------------------------------------------
set(NMC_SYSTEM_TYPE "Generic" CACHE STRING
"Choose a system type to customize flags")
set_property(CACHE NMC_SYSTEM_TYPE PROPERTY STRINGS Generic Cray BGQ )
# Cray specific flags
if(${NMC_SYSTEM_TYPE} MATCHES "Cray")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -dynamic")
endif()
#----------------------------------------------------------
# MPI support
#----------------------------------------------------------
set(NMC_DISTRIBUTED_MODEL "serial" CACHE STRING "set the global communication model, one of serial/mpi/dryrun")
set_property(CACHE NMC_DISTRIBUTED_MODEL PROPERTY STRINGS serial mpi dryrun)
if(NMC_DISTRIBUTED_MODEL MATCHES "mpi")
# BGQ specific flags
if(${NMC_SYSTEM_TYPE} MATCHES "BGQ" )
# On BGQ, set CXX to the mpi wrapper, and pass it a static
add_definitions(-DMPICH2_CONST=const)
set(MPI_FOUND TRUE)
endif()
if (NOT MPI_FOUND)
find_package(MPI REQUIRED)
endif()
include_directories(SYSTEM ${MPI_C_INCLUDE_PATH})
add_definitions(-DNMC_HAVE_MPI)
# unfortunate workaround for C++ detection in system mpi.h
add_definitions(-DMPICH_SKIP_MPICXX=1 -DOMPI_SKIP_MPICXX=1)
set_property(DIRECTORY APPEND_STRING PROPERTY COMPILE_OPTIONS "${MPI_C_COMPILE_FLAGS}")
set(NMC_WITH_MPI TRUE)
elseif(NMC_DISTRIBUTED_MODEL MATCHES "dryrun")
add_definitions(-DNMC_HAVE_DRYRUN)
set(NMC_WITH_DRYRUN TRUE)
elseif(NMC_DISTRIBUTED_MODEL MATCHES "serial")
# no additional set up needed
else()
message( FATAL_ERROR "-- Distributed communication model '${NMC_DISTRIBUTED_MODEL}' not supported, use one of serial/mpi/dryrun")
endif()
#----------------------------------------------------------
# Built-in profiler
#----------------------------------------------------------
option(NMC_WITH_PROFILING "use built-in profiling of miniapp" OFF)
if(NMC_WITH_PROFILING)
add_definitions(-DNMC_HAVE_PROFILING)
endif()
#----------------------------------------------------------
# vectorization target
#----------------------------------------------------------
set(NMC_VECTORIZE_TARGET "none" CACHE STRING "CPU target for vectorization {KNL,AVX,AVX2}")
set_property(CACHE NMC_VECTORIZE_TARGET PROPERTY STRINGS none KNL AVX AVX2)
if(NMC_VECTORIZE_TARGET STREQUAL "KNL")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXXOPT_KNL}")
elseif(NMC_VECTORIZE_TARGET STREQUAL "AVX")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXXOPT_AVX}")
elseif(NMC_VECTORIZE_TARGET STREQUAL "AVX2")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXXOPT_AVX2}")
endif()
#----------------------------------------------------------
# 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.
#----------------------------------------------------------
set(use_external_modcc OFF)
find_program(MODCC_BIN modcc)
if(MODCC_BIN)
set(use_external_modcc ON)
set(modcc "${MODCC_BIN}")
else()
set(modcc $<TARGET_FILE:modcc>)
endif()
#----------------------------------------------------------
# Validation data generation
#----------------------------------------------------------
# destination directory for generated data
set(NMC_VALIDATION_DATA_DIR "${PROJECT_SOURCE_DIR}/validation/data" CACHE PATH
"location of generated validation data")
#----------------------------------------------------------
# Whether to build validation data
#----------------------------------------------------------
# turn off by default
option(NMC_BUILD_VALIDATION_DATA "generate validation data" OFF)
if (NMC_BUILD_VALIDATION_DATA)
# Whether to attempt to use julia to build validation data
find_program(JULIA_BIN julia)
if(JULIA_BIN STREQUAL "JULIA_BIN-NOTFOUND")
message(STATUS "julia not found; will not automatically build validation data sets from julia scripts")
set(NMC_BUILD_JULIA_VALIDATION_DATA FALSE)
else()
set(NMC_BUILD_JULIA_VALIDATION_DATA TRUE)
endif()
# Whether to attempt to use nrniv to build validation data
# (if we find nrniv, do)
find_program(NRNIV_BIN nrniv)
if(NRNIV_BIN STREQUAL "NRNIV_BIN-NOTFOUND")
message(STATUS "nrniv not found; will not automatically build NEURON validation data sets")
set(NMC_BUILD_NRN_VALIDATION_DATA FALSE)
else()
set(NMC_BUILD_NRN_VALIDATION_DATA TRUE)
endif()
endif()
#----------------------------------------------------------
# Setup include dirs
#----------------------------------------------------------
include_directories(
"${PROJECT_SOURCE_DIR}/tclap"
"${PROJECT_SOURCE_DIR}/include"
"${PROJECT_SOURCE_DIR}/src"
"${PROJECT_SOURCE_DIR}/miniapp"
"${PROJECT_SOURCE_DIR}/modcc"
"${PROJECT_SOURCE_DIR}")
if(EXTERNAL_INCLUDES)
include_directories("${EXTERNAL_INCLUDES}")
endif()
#----------------------------------------------------------
# Setup subdirs
#----------------------------------------------------------
# only include validation data if flag is set
if(NMC_BUILD_VALIDATION_DATA)
add_subdirectory(validation)
endif()
# only compile modcc if it is not provided externally
if(NOT use_external_modcc)
add_subdirectory(modcc)
endif()
add_subdirectory(mechanisms)
add_subdirectory(src)
add_subdirectory(tests)
add_subdirectory(miniapp)
add_subdirectory(lmorpho)