|
| 1 | +# FindWin32IntelMPI: Find Intel oneAPI MPI for Win32 |
| 2 | + |
| 3 | +# Here we assume Intel ONEAPI and the environment is loaded |
| 4 | +set( MPI_ASSUME_NO_BUILTIN_MPI TRUE ) |
| 5 | +set( MPI_CXX_SKIP_MPICXX TRUE ) |
| 6 | +cmake_path(SET MPI_ROOT NORMALIZE "$ENV{I_MPI_ROOT}") |
| 7 | +set (IMPI_LIB_DIR "${MPI_ROOT}/lib") |
| 8 | +set (IMPI_DLL_DIR "${MPI_ROOT}/bin") |
| 9 | + |
| 10 | +message(STATUS "Looking in IMPI_LIB_DIR=${IMPI_LIB_DIR}") |
| 11 | +message(STATUS "Looking in IMPI_DLL_DIR=${IMPI_DLL_DIR}") |
| 12 | +find_library(IMPI_LIB |
| 13 | + "impi.lib" |
| 14 | + HINTS "${IMPI_LIB_DIR}" |
| 15 | + PATH_SUFFIXES "${IMPI_BUILD}" |
| 16 | + DOC "Location of the Intel MPI impi.lib file" |
| 17 | + REQUIRED |
| 18 | + NO_DEFAULT_PATH) |
| 19 | + |
| 20 | +find_file(IMPI_DLL |
| 21 | + "impi.dll" |
| 22 | + HINTS "${IMPI_DLL_DIR}" |
| 23 | + PATH_SUFFIXES "${IMPI_BUILD}" |
| 24 | + DOC "Location of the Intel MPI impi.dll file" |
| 25 | + REQUIRED |
| 26 | + NO_DEFAULT_PATH) |
| 27 | + |
| 28 | +set( MPI_C_COMPILER ${CMAKE_C_COMPILER} CACHE FILEPATH "MPI C compiler" FORCE) |
| 29 | +set( MPI_C_COMPILER_INCLUDE_DIRS "${MPI_ROOT}/include" CACHE FILEPATH "MPI C include dir") |
| 30 | +set( MPI_C_LIBRARIES ${IMPI_LIB};${IMPI_DLL} CACHE FILEPATH "MPI C libs to link" ) |
| 31 | +set( MPI_C_LIB_PATHS "${MPI_ROOT}" CACHE FILEPATH "MPI C lib's paths to link" ) |
| 32 | + |
| 33 | +set( MPI_Fortran_COMPILER ${CMAKE_Fortran_COMPILER} CACHE FILEPATH "MPI Fortran compiler" FORCE) |
| 34 | +set( MPI_Fortran_LIBRARIES ${IMPI_LIB};${IMPI_DLL} CACHE FILEPATH "MPI Fortran libs to link" FORCE) |
| 35 | +set( MPI_Fortran_COMPILER_INCLUDE_DIRS "${MPI_ROOT}/include" CACHE FILEPATH "MPI Fortran include dir") |
| 36 | +set( MPI_Fortran_MODULE_DIRS "${MPI_ROOT}/include/mpi" CACHE FILEPATH "MPI Fortran module dir") |
| 37 | +set( MPI_Fortran_LIB_PATHS "${MPI_ROOT}" CACHE FILEPATH "MPI libraries paths for Fortran") |
| 38 | + |
| 39 | +set( MPIEXEC_EXECUTABLE "${MPI_ROOT}/bin/mpiexec.exe" CACHE FILEPATH "Path to mpiexec") |
| 40 | +set( MPI_impi_LIBRARY "${IMPI_LIB}" CACHE FILEPATH "MPI lib to link" ) |
| 41 | + |
| 42 | +set(MPI_Fortran_HAVE_F90_MODULE FALSE) |
| 43 | +set(MPI_Fortran_HAVE_F08_MODULE FALSE) |
| 44 | + |
| 45 | +#-------------------------------------------------------- |
| 46 | +# Make sure a simple "hello world" C mpi program compiles |
| 47 | +#-------------------------------------------------------- |
| 48 | +set(OLD_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) |
| 49 | +set(CMAKE_REQUIRED_FLAGS ${MPI_C_COMPILE_OPTIONS} ${MPI_C_LINK_FLAGS}) |
| 50 | +set(OLD_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}) |
| 51 | +set(CMAKE_REQUIRED_DEFINITIONS ${MPI_C_COMPILE_DEFINITIONS}) |
| 52 | +set(OLD_INCLUDES ${CMAKE_REQUIRED_INCLUDES}) |
| 53 | +set(CMAKE_REQUIRED_INCLUDES ${MPI_C_COMPILER_INCLUDE_DIRS}) |
| 54 | +set(OLD_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES}) |
| 55 | +if(WIN32) |
| 56 | + set(CMAKE_REQUIRED_LIBRARIES ${MPI_C_LIBRARIES}) |
| 57 | +else() |
| 58 | + set(CMAKE_REQUIRED_LIBRARIES ${MPI_C_LIBRARIES}) |
| 59 | +endif() |
| 60 | +set(OLD_LINK_DIRECTORIES ${CMAKE_REQUIRED_LINK_DIRECTORIES}) |
| 61 | +set(CMAKE_REQUIRED_LINK_DIRECTORIES ${MPI_C_LIB_PATHS}) |
| 62 | +include (CheckCSourceCompiles) |
| 63 | +CHECK_C_SOURCE_COMPILES(" |
| 64 | +#include <mpi.h> |
| 65 | +#include <stdio.h> |
| 66 | +int main(int argc, char** argv) { |
| 67 | + MPI_Init(NULL, NULL); |
| 68 | + int world_size; |
| 69 | + MPI_Comm_size(MPI_COMM_WORLD, &world_size); |
| 70 | + int world_rank; |
| 71 | + MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); |
| 72 | + char processor_name[MPI_MAX_PROCESSOR_NAME]; |
| 73 | + int name_len; |
| 74 | + MPI_Get_processor_name(processor_name, &name_len); |
| 75 | + printf(\"Hello world from processor %s, rank %d out of %d processors\", |
| 76 | + processor_name, world_rank, world_size); |
| 77 | + MPI_Finalize(); |
| 78 | +}" |
| 79 | +MPI_C_COMPILES) |
| 80 | +set(CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS}) |
| 81 | +set(CMAKE_REQUIRED_DEFINITIONS ${OLD_REQUIRED_DEFINITIONS}) |
| 82 | +set(CMAKE_REQUIRED_INCLUDES ${OLD_INCLUDES}) |
| 83 | +set(CMAKE_REQUIRED_LIBRARIES ${OLD_LIBRARIES}) |
| 84 | +set(CMAKE_REQUIRED_LINK_DIRECTORIES ${OLD_LINK_DIRECTORIES}) |
| 85 | +unset(OLD_REQUIRED_FLAGS) |
| 86 | +unset(OLD_INCLUDES) |
| 87 | +unset(OLD_LIBRARIES) |
| 88 | +unset(OLD_LINK_LIBRARIES) |
| 89 | +unset(OLD_LINK_DIRECTORIES) |
| 90 | + |
| 91 | +if (NOT MPI_C_COMPILES) |
| 92 | + message(FATAL_ERROR "MPI_C is missing! " |
| 93 | + "Try setting MPI_C_COMPILER to the appropriate C compiler wrapper script and reconfigure. " |
| 94 | + "i.e., `cmake -DMPI_C_COMPILER=/path/to/mpicc ..` or set it by editing the cache using " |
| 95 | + "cmake-gui or ccmake." |
| 96 | + ) |
| 97 | +endif() |
| 98 | + |
| 99 | +#-------------------------------------------------------------- |
| 100 | +# Make sure a simple "hello world" Fortran mpi program compiles |
| 101 | +# Try using mpi.mod first then fall back on includ 'mpif.h' |
| 102 | +#-------------------------------------------------------------- |
| 103 | +set(OLD_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) |
| 104 | +set(CMAKE_REQUIRED_FLAGS "-ffree-form" ${MPI_Fortran_COMPILE_OPTIONS} ${MPI_Fortran_LINK_FLAGS}) |
| 105 | +set(OLD_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}) |
| 106 | +set(CMAKE_REQUIRED_DEFINITIONS ${MPI_Fortran_COMPILE_DEFINITIONS}) |
| 107 | +set(OLD_INCLUDES ${CMAKE_REQUIRED_INCLUDES}) |
| 108 | +set(CMAKE_REQUIRED_INCLUDES ${MPI_Fortran_COMPILER_INCLUDE_DIRS};${MPI_Fortran_MODULE_DIRS}) |
| 109 | +set(OLD_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES}) |
| 110 | +if(WIN32) |
| 111 | + set(CMAKE_REQUIRED_LIBRARIES ${MPI_Fortran_LIBRARIES}) |
| 112 | +else() |
| 113 | + set(CMAKE_REQUIRED_LIBRARIES ${MPI_Fortran_LIBRARIES}) |
| 114 | +endif() |
| 115 | +set(OLD_LINK_DIRECTORIES ${CMAKE_REQUIRED_LINK_DIRECTORIES}) |
| 116 | +set(CMAKE_REQUIRED_LINK_DIRECTORIES ${MPI_Fortran_LIB_PATHS}) |
| 117 | +include (CheckFortranSourceCompiles) |
| 118 | +CHECK_Fortran_SOURCE_COMPILES(" |
| 119 | +program mpi_hello |
| 120 | +use mpi |
| 121 | +implicit none |
| 122 | +integer :: ierr, mpi_world_size, mpi_world_rank, res_len |
| 123 | +character*(MPI_MAX_PROCESSOR_NAME) :: proc |
| 124 | +call mpi_init(ierr) |
| 125 | +call mpi_comm_size(MPI_COMM_WORLD,mpi_world_size,ierr) |
| 126 | +call mpi_comm_rank(MPI_COMM_WORLD,mpi_world_rank,ierr) |
| 127 | +call mpi_get_processor_name(proc,res_len,ierr) |
| 128 | +write(*,*) 'Hello from processor ', trim(proc), ' rank ', mpi_world_rank, ' out of ', mpi_world_size, '.' |
| 129 | +call mpi_finalize(ierr) |
| 130 | +end program |
| 131 | +" |
| 132 | +MPI_Fortran_MODULE_COMPILES) |
| 133 | +set(CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS}) |
| 134 | +set(CMAKE_REQUIRED_DEFINITIONS ${OLD_REQUIRED_DEFINITIONS}) |
| 135 | +set(CMAKE_REQUIRED_INCLUDES ${OLD_INCLUDES}) |
| 136 | +set(CMAKE_REQUIRED_LIBRARIES ${OLD_LIBRARIES}) |
| 137 | +set(CMAKE_REQUIRED_LINK_DIRECTORIES ${OLD_LINK_DIRECTORIES}) |
| 138 | +unset(OLD_REQUIRED_FLAGS) |
| 139 | +unset(OLD_INCLUDES) |
| 140 | +unset(OLD_LIBRARIES) |
| 141 | +unset(OLD_LINK_LIBRARIES) |
| 142 | +unset(OLD_LINK_DIRECTORIES) |
| 143 | + |
| 144 | +#-------------------------------- |
| 145 | +# If that failed try using mpif.h |
| 146 | +#-------------------------------- |
| 147 | +set(OLD_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) |
| 148 | +set(CMAKE_REQUIRED_FLAGS "-ffree-form" ${MPI_Fortran_COMPILE_OPTIONS} ${MPI_Fortran_LINK_FLAGS}) |
| 149 | +set(OLD_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}) |
| 150 | +set(CMAKE_REQUIRED_DEFINITIONS ${MPI_Fortran_COMPILE_DEFINITIONS}) |
| 151 | +set(OLD_INCLUDES ${CMAKE_REQUIRED_INCLUDES}) |
| 152 | +set(CMAKE_REQUIRED_INCLUDES ${MPI_Fortran_COMPILER_INCLUDE_DIRS};${MPI_Fortran_MODULE_DIRS}) |
| 153 | +set(OLD_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES}) |
| 154 | +if(WIN32) |
| 155 | + set(CMAKE_REQUIRED_LIBRARIES ${MPI_Fortran_LIBRARIES}) |
| 156 | +else() |
| 157 | + set(CMAKE_REQUIRED_LIBRARIES ${MPI_Fortran_LIBRARIES}) |
| 158 | +endif() |
| 159 | +set(OLD_LINK_DIRECTORIES ${CMAKE_REQUIRED_LINK_DIRECTORIES}) |
| 160 | +set(CMAKE_REQUIRED_LINK_DIRECTORIES ${MPI_Fortran_LIB_PATHS}) |
| 161 | +include (CheckFortranSourceCompiles) |
| 162 | +CHECK_Fortran_SOURCE_COMPILES(" |
| 163 | +program mpi_hello |
| 164 | +implicit none |
| 165 | +include 'mpif.h' |
| 166 | +integer :: ierr, mpi_world_size, mpi_world_rank, res_len |
| 167 | +character*(MPI_MAX_PROCESSOR_NAME) :: proc |
| 168 | +call mpi_init(ierr) |
| 169 | +call mpi_comm_size(MPI_COMM_WORLD,mpi_world_size,ierr) |
| 170 | +call mpi_comm_rank(MPI_COMM_WORLD,mpi_world_rank,ierr) |
| 171 | +call mpi_get_processor_name(proc,res_len,ierr) |
| 172 | +write(*,*) 'Hello from processor ', trim(proc), ' rank ', mpi_world_rank, ' out of ', mpi_world_size, '.' |
| 173 | +call mpi_finalize(ierr) |
| 174 | +end program |
| 175 | +" |
| 176 | + MPI_Fortran_INCLUDE_COMPILES) |
| 177 | +set(CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS}) |
| 178 | +set(CMAKE_REQUIRED_DEFINITIONS ${OLD_REQUIRED_DEFINITIONS}) |
| 179 | +set(CMAKE_REQUIRED_INCLUDES ${OLD_INCLUDES}) |
| 180 | +set(CMAKE_REQUIRED_LIBRARIES ${OLD_LIBRARIES}) |
| 181 | +set(CMAKE_REQUIRED_LINK_DIRECTORIES ${OLD_LINK_DIRECTORIES}) |
| 182 | +unset(OLD_REQUIRED_FLAGS) |
| 183 | +unset(OLD_INCLUDES) |
| 184 | +unset(OLD_LIBRARIES) |
| 185 | +unset(OLD_LINK_LIBRARIES) |
| 186 | +unset(OLD_LINK_DIRECTORIES) |
| 187 | + |
| 188 | +if ( (NOT MPI_Fortran_MODULE_COMPILES) AND (NOT MPI_Fortran_INCLUDE_COMPILES) ) |
| 189 | + message ( WARNING "It appears that the Fortran MPI compiler is not working. " |
| 190 | + "For OpenCoarrays Aware compilers, this may be irrelavent: " |
| 191 | + " The src/extensions/opencoarrays.F90 module will be disabled, but it is " |
| 192 | + " possible that the build will succeed, despite this fishy circumstance." |
| 193 | + ) |
| 194 | +else() |
| 195 | + set(MPI_C_FOUND TRUE) |
| 196 | + set(MPI_Fortran_FOUND TRUE) |
| 197 | +endif() |
0 commit comments