diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 662172e92a38e4d8db1b9eb0321cc24c540f9a9d..255ff7220604d52eee119f009668779e330f7549 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,35 +1,79 @@ +## Specify the project cmake_minimum_required(VERSION 3.9 FATAL_ERROR) +if(NOT CMAKE_CUDA_ARCHITECTURES) + set(CMAKE_CUDA_ARCHITECTURES 70 75) +endif() + # option(USE_CUDA "Use CUDA" ON) set(USE_CUDA ON) if(USE_CUDA) - # set the project name and version project(arbd VERSION 1.2 LANGUAGES CXX CUDA) else(USE_CUDA) project(arbd VERSION 1.2 LANGUAGES CXX) endif() -# specify the C++ standard +## specify the C++ standard set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED True) set(CMAKE_VERBOSE_MAKEFILE True) +# Set a default build type if none was specified +set(default_build_type "Release") + +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + message(STATUS "Setting build type to '${default_build_type}' as none was specified.") + set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE + STRING "Choose the type of build." FORCE) + # # Set the possible values of build type for cmake-gui + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Release" "RelWithDebInfo" "MinSizeRel") +endif() + + + +if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + ## Some CMake uses -O2 for relase, override here + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3") + + if( CMAKE_BUILD_TYPE STREQUAL "Release") + set( CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -O3" ) + endif() +endif() + + ## OPTIONS -option(USE_NCCL "Use NCCL for single node GPU peer communication" ON) +option(USE_NCCL "Use NCCL for single node GPU peer communication" False) +option(USE_NVTX "Build with NVTX profiling ranges" False) +option(DEBUG "Build with debug flags" False) + +# (not yet optional) message(STATUS "USE_CUDA: ${USE_CUDA}") +message(STATUS "USE_NCCL: ${USE_NCCL}") +message(STATUS "USE_NVTX: ${USE_NVTX}") +message(STATUS "DEBUG: ${DEBUG}") + +## Set flags before adding executable # configure_file(TutorialConfig.h.in TutorialConfig.h) -message(STATUS "USE_CUDA: ${USE_CUDA}") if(USE_CUDA) add_definitions(-DUSE_CUDA) ## CUDA_INCLUDE_DIRS wasn't getting set on my system with cmake 3.14.1, so check if in env if(DEFINED ENV{CUDA_INCLUDE_DIRS}) set(CUDA_INCLUDE_DIRS $ENV{CUDA_INCLUDE_DIRS}) endif() - message(STATUS "CUDA_INC: ${CUDA_INCLUDE_DIRS}") + # message(STATUS "CUDA_INC: ${CUDA_INCLUDE_DIRS}") include_directories(${CUDA_INCLUDE_DIRS}) endif() +if(USE_NVTX) + add_definitions(-DUSE_NVTX) +endif() +if(USE_NCCL) + add_definitions(-DUSE_NCCL) + target_link_libraries(arbd PRIVATE nccl) +endif() + ## Two lines below needed? set(CMAKE_CUDA_SEPARABLE_COMPILATION ON) set(CMAKE_POSITION_INDEPENDENT_CODE ON) @@ -83,9 +127,12 @@ add_executable(arbd arbd.cpp useful.cu ) -target_link_libraries(arbd PRIVATE curand) - -message(STATUS "Run: ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} ${MPIEXEC_MAX_NUMPROCS} ${MPIEXEC_PREFLAGS} EXECUTABLE ${MPIEXEC_POSTFLAGS} ARGS") -## target_link_libraries(ARBD PUBLIC) MPI::MPI_CXX) +## Add optional libraries +if(USE_CUDA) + target_link_libraries(arbd PRIVATE curand) +endif() +if(USE_NCCL) + target_link_libraries(arbd PRIVATE nccl) +endif() install(TARGETS arbd)