Remove use of FindMPI.cmake
authorMark Abraham <mark.j.abraham@gmail.com>
Mon, 9 Jan 2012 09:38:33 +0000 (20:38 +1100)
committerMark Abraham <mark.j.abraham@gmail.com>
Sat, 14 Jan 2012 05:16:41 +0000 (16:16 +1100)
The functionality of FindMPI.cmake should not be needed for GROMACS,
since the wrapper compiler will do the complete job. This already
worked for Cray and BlueGene, and so far this new version is known
to work for OpenMPI wrapping icc and gcc.

CMake now warns the user about possible unsuitable versions of
OpenMPI and MVAPICH2.

The process of managing MPI is more modular than it used to be.

To use:

cmake .. -DGMX_MPI=ON -DCMAKE_C_COMPILER=`which mpicc`

or with bash

CC=mpicc cmake .. -DGMX_MPI=ON

and whatever else suits your setup.

Fixes #851 and #636.

Change-Id: Ibe41206bed8b70b83a25da1e4e29dd87b61ea17d

CMakeLists.txt
admin/GerritBuild
cmake/gmxManageMPI.cmake [new file with mode: 0644]
cmake/gmxTestMPI_IN_PLACE.cmake

index e1d93bebb12c066b0b63a6f4950e9b3007d4875b..ff80a485dd13d2ce2b1f84391f9460f93e9110a8 100644 (file)
@@ -192,74 +192,7 @@ endif(GMX_POWERPC_INVSQRT)
 ########################################################################
 #Process MPI settings
 ########################################################################
-include(CheckCSourceCompiles) # for gmxTestMPI_IN_PLACE
-if(GMX_MPI)
-    if(GMX_THREADS)
-        #message(FATAL_ERROR "Thread-based parallelization conflicts with MPI.")
-        set(GMX_THREADS OFF CACHE BOOL 
-            "Thread-based parallelization conflicts with MPI." FORCE)
-    endif(GMX_THREADS)
-
-    # Work-around for Cray MPI
-    TRY_COMPILE(MPI_FOUND ${CMAKE_BINARY_DIR}
-      "${CMAKE_SOURCE_DIR}/cmake/TestMPI.c"
-      COMPILE_DEFINITIONS )
-    if(NOT MPI_FOUND)
-      # search for normal MPI installations
-      find_package(MPI)
-    endif(NOT MPI_FOUND)
-
-    if(MPI_FOUND)
-        set(GROMACS_C_FLAGS ${GROMACS_FLAGS} ${MPI_COMPILE_FLAGS})
-       set(GROMACS_LINKER_FLAGS ${GROMACS_LINKER_FLAGS} ${MPI_LINK_FLAGS})
-        
-        include_directories(${MPI_INCLUDE_PATH})
-        list(APPEND GMX_EXTRA_LIBRARIES ${MPI_LIBRARIES})
-        if(GMX_FAHCORE)
-            add_definitions( -DMPI ) #for FAHCORE
-        endif(GMX_FAHCORE)
-        include(gmxTestMPI_IN_PLACE)
-        if (GMX_MPI_IN_PLACE)
-            gmx_test_mpi_in_place(MPI_IN_PLACE_EXISTS)
-        endif (GMX_MPI_IN_PLACE)
-
-       # test for unsuitable versions of OpenMPI
-       exec_program(${MPIEXEC}
-         ARGS --version
-         OUTPUT_VARIABLE MPI_TYPE
-         RETURN_VALUE MPI_EXEC_RETURN)
-       if(MPI_EXEC_RETURN EQUAL 0)
-         if(MPI_TYPE MATCHES "Open MPI|OpenRTE")
-           string(REGEX MATCH "[0-9]+\\.[0-9]*\\.?[0-9]*" MPI_VERSION ${MPI_TYPE})
-           if(MPI_VERSION VERSION_LESS "1.4.1")
-             MESSAGE(WARNING "
-            There are known problems with OpenMPI version < 1.4.1.
-            Please consider updating your OpenMPI.")
-           endif(MPI_VERSION VERSION_LESS "1.4.1")
-           unset(MPI_VERSION)
-         else(MPI_TYPE MATCHES "Open MPI|OpenRTE")
-           # This is not OpenMPI, so give the old generic warning message
-           MESSAGE(WARNING "
-            There are known problems with some MPI implementations:
-                     MVAPICH2 version <= 1.4.1
-            Please consider updating your MPI if applicable.")
-         endif(MPI_TYPE MATCHES "Open MPI|OpenRTE")
-         unset(MPI_TYPE)
-       endif(MPI_EXEC_RETURN EQUAL 0)
-    else(MPI_FOUND)
-        message(FATAL_ERROR "MPI support requested, but no MPI compiler found.")
-    endif(MPI_FOUND)
-    include(gmxTestCatamount)
-    gmx_test_catamount(GMX_CRAY_XT3)
-    if(GMX_CRAY_XT3)
-        set(PKG_CFLAGS "${PKG_CFLAGS} -DGMX_CRAY_XT3")
-        set(GMX_NO_SYSTEM 1)
-        set(GMX_NO_NICE 1)
-    endif(GMX_CRAY_XT3)
-    set(GMX_LIB_MPI 1)
-    set(PKG_CFLAGS "${PKG_CFLAGS} -DGMX_LIB_MPI")
-endif(GMX_MPI)
-
+include(gmxManageMPI)
 
 #######################################################################
 # Check for options incompatible with OpenMM build                    #
index a069921f77475d05117d094408c4a783156337b8..88a4ec0c4095e57a578cc0f576e3fad598538f97 100755 (executable)
@@ -3,9 +3,18 @@ if [ -n "${CMakeVersion}" ] ; then
    export PATH=$HOME/tools/cmake-${CMakeVersion}/bin:$PATH
 fi
 export CMAKE_LIBRARY_PATH=/usr/lib/atlas-base
-export CC=gcc-${CompilerVersion} 
-export CXX=g++-${CompilerVersion} 
-export FC=gfortran-${CompilerVersion} 
+if [ $GMX_MPI = on ]; then
+    export OMPI_CC=gcc-${CompilerVersion}
+    export OMPI_CXX=g++-${CompilerVersion}
+    export OMPI_FC=gfortran-${CompilerVersion}
+    export CC=mpicc
+    export CXX=mpic++
+    export FC=mpif90
+else
+    export CC=gcc-${CompilerVersion}
+    export CXX=g++-${CompilerVersion}
+    export FC=gfortran-${CompilerVersion}
+fi
 cmake -D GMX_DOUBLE=${GMX_DOUBLE} -D GMX_MPI=${GMX_MPI} -D GMX_OPENMP=${GMX_OPENMP} \
     -DGMX_EXTERNAL_BLAS=${GMX_EXTERNAL} -DGMX_EXTERNAL_LAPACK=${GMX_EXTERNAL} \
     -DGMX_DEFAULT_SUFFIX=off -DCMAKE_BUILD_TYPE=Debug . &&
diff --git a/cmake/gmxManageMPI.cmake b/cmake/gmxManageMPI.cmake
new file mode 100644 (file)
index 0000000..5129bae
--- /dev/null
@@ -0,0 +1,77 @@
+# Manage the MPI setup, assuming that CMAKE_C_COMPILER is an MPI
+# (wrapper) compiler.
+if(GMX_MPI)
+  if(GMX_THREADS)
+    set(GMX_THREADS OFF CACHE BOOL
+      "Thread-based parallelization conflicts with MPI." FORCE)
+  endif(GMX_THREADS)
+
+  # Test the CMAKE_C_COMPILER for being an MPI (wrapper) compiler
+  TRY_COMPILE(MPI_FOUND ${CMAKE_BINARY_DIR}
+    "${CMAKE_SOURCE_DIR}/cmake/TestMPI.c"
+    COMPILE_DEFINITIONS )
+
+  if(MPI_FOUND)
+    if(GMX_FAHCORE)
+      add_definitions( -DMPI ) #for FAHCORE
+    endif()
+    include(gmxTestMPI_IN_PLACE)
+    if (GMX_MPI_IN_PLACE)
+      gmx_test_mpi_in_place(MPI_IN_PLACE_EXISTS)
+    endif()
+
+    # Test for and warn about unsuitable MPI versions
+    exec_program(ompi_info
+      ARGS -v ompi full
+      OUTPUT_VARIABLE OPENMPI_TYPE
+      RETURN_VALUE OPENMPI_EXEC_RETURN)
+    if(OPENMPI_EXEC_RETURN EQUAL 0)
+      string(REGEX REPLACE ".*Open MPI: \([0-9]+\\.[0-9]*\\.?[0-9]*\).*" "\\1" OPENMPI_VERSION ${OPENMPI_TYPE})
+      if(OPENMPI_VERSION VERSION_LESS "1.4.1")
+        MESSAGE(WARNING "
+             CMake found OpenMPI version ${OPENMPI_VERSION} on your system.
+             There are known problems with GROMACS and OpenMPI version < 1.4.1.
+             Please consider updating your OpenMPI if your MPI wrapper compilers
+             are using the above OpenMPI version.")
+      endif()
+      unset(OPENMPI_VERSION)
+      unset(OPENMPI_TYPE)
+      unset(OPENMPI_EXEC_RETURN)
+    endif()
+    exec_program(mpiname
+      ARGS -n -v
+      OUTPUT_VARIABLE MVAPICH2_TYPE
+      RETURN_VALUE MVAPICH2_EXEC_RETURN)
+    if(MVAPICH2_EXEC_RETURN EQUAL 0)
+      string(REGEX MATCH "MVAPICH2" MVAPICH2_NAME ${MVAPICH2_TYPE})
+      # Want to check for MVAPICH2 in case some other library supplies mpiname
+      string(REGEX REPLACE "MVAPICH2 \([0-9]+\\.[0-9]*[a-z]?\\.?[0-9]*\)" "\\1" MVAPICH2_VERSION ${MVAPICH2_TYPE})
+      if(${MVAPICH2_NAME} STREQUAL "MVAPICH2" AND MVAPICH2_VERSION VERSION_LESS "1.5")
+        # This test works correctly even with 1.5a1
+        MESSAGE(WARNING "
+             CMake found MVAPICH2 version ${MVAPICH2_VERSION} on your system.
+             There are known problems with GROMACS and MVAPICH2 version < 1.5.
+             Please consider updating your MVAPICH2 if your MPI wrapper compilers
+             are using the above MVAPICH2 version.")
+      endif()
+      unset(MVAPICH2_VERSION)
+      unset(MVAPICH2_NAME)
+      unset(MVAPICH2_TYPE)
+      unset(MVAPICH2_EXEC_RETURN)
+    endif()
+
+  else(MPI_FOUND)
+    message(FATAL_ERROR "MPI support requested, but no MPI compiler found.")
+  endif(MPI_FOUND)
+
+  include(gmxTestCatamount)
+  gmx_test_catamount(GMX_CRAY_XT3)
+  if(GMX_CRAY_XT3)
+    set(PKG_CFLAGS "${PKG_CFLAGS} -DGMX_CRAY_XT3")
+    set(GMX_NO_SYSTEM 1)
+    set(GMX_NO_NICE 1)
+  endif(GMX_CRAY_XT3)
+
+  set(GMX_LIB_MPI 1)
+  set(PKG_CFLAGS "${PKG_CFLAGS} -DGMX_LIB_MPI")
+endif(GMX_MPI)
index 93072973fdf92195077826be465584d89d47bc1b..8668cfdb58e734f1d7f6abd06435bed49a326d00 100644 (file)
@@ -5,6 +5,7 @@
 #  VARIABLE will be set to true if MPI_IN_PLACE exists
 #
 
+include(CheckCSourceCompiles)
 MACRO(GMX_TEST_MPI_IN_PLACE VARIABLE)
     MESSAGE(STATUS "Checking for MPI_IN_PLACE")