diff --git a/CMakeLists.txt b/CMakeLists.txt index 1e9838b4727d6ed946df6aec34bfc939601e542f..72ac867917e76a6b92ffe0a2073d0fd6d4f72b0a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,13 +20,26 @@ set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) # TBB support -set( WITH_TBB "OFF" CACHE BOOL "use TBB for on-node threading" ) -if( "${WITH_TBB}" STREQUAL "ON" ) +set( WITH_TBB OFF CACHE BOOL "use TBB for on-node threading" ) +if(${WITH_TBB}) find_package(TBB REQUIRED) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWITH_TBB ${TBB_DEFINITIONS}") link_directories(${TBB_LIBRARY}) endif() +# MPI support +# relies on the user specifying an MPI-aware compiler wrapper +set( WITH_MPI OFF CACHE BOOL "use MPI for distrubuted parallelism" ) +if(${WITH_MPI}) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWITH_MPI") +endif() + +# Cray systems +set( SYSTEM_CRAY OFF CACHE BOOL "add flags for compilation on Cray systems" ) +if( ${SYSTEM_CRAY} ) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -dynamic") +endif() + # targets for extermal dependencies include(ExternalProject) diff --git a/README.md b/README.md index 0cb0c0d8dd27b41cf9358aebb5761cf221c72bef..dc2e7d720fa5452c15f2db6b2e7ad6001928cb85 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,9 @@ git submodule init git submodule update # setup environment -module load gcc +# on a desktop system this might not be required +# on a cluster this could be required +module load gcc module load cmake export CC=`which gcc` export CXX=`which g++` @@ -25,3 +27,53 @@ make -j cd tests ./test.exe ``` + +## MPI + +Set the `WITH_MPI` option either via the ccmake interface, or via the command line as shown below. +For the time being our CMake configuration does not try to detect MPI. +Instead, it relies on the user specifying an MPI wrapper for the compiler by setting the `CXX` and `CC` environment variables. + +``` +export CXX=mpicxx +export CC=mpicc +cmake <path to CMakeLists.txt> -DWITH_MPI=ON + +``` + +## TBB + +Support for multi-threading requires Intel Threading Building Blocks (TBB). +When TBB is installed, it comes with some scripts that can be run to set up the user environment. +The scripts set the `TBB_ROOT` environment variable, which is used by the CMake configuration to find TBB. + + +``` +source <path to TBB installation>/tbbvars.sh +cmake <path to CMakeLists.txt> -DWITH_TBB=ON +``` + +### TBB on Cray systems + +To compile with TBB on Cray systems, load the intel module, which will automatically configure the environment. + +``` +# load the gnu environment for compiling the application +module load PrgEnv-gnu +# gcc 5.x does not work with the version of TBB installed on Cray +# requires at least version 4.4 of TBB +module swap gcc/4.9.3 +# load the intel programming module +# on Cray systems this automatically sets `TBB_ROOT` environment variable +module load intel +module load cmake +export CXX=`which CC` +export CC=`which cc` + +# multithreading only +cmake <path to CMakeLists.txt> -DWITH_TBB=ON -DSYSTEM_CRAY=ON + +# multithreading and MPI +cmake <path to CMakeLists.txt> -DWITH_TBB=ON -DWITH_MPI=ON -DSYSTEM_CRAY=ON + +```