From 5d5920d91218d9809d803e30e06cdd10233c6564 Mon Sep 17 00:00:00 2001
From: bcumming <bcumming@cscs.ch>
Date: Fri, 24 Jun 2016 14:48:30 +0200
Subject: [PATCH] add cmake support for MPI and Cray systems, updated README

---
 CMakeLists.txt | 17 ++++++++++++++--
 README.md      | 54 +++++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 68 insertions(+), 3 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1e9838b4..72ac8679 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 0cb0c0d8..dc2e7d72 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
+
+```
-- 
GitLab