diff --git a/cmake_modules/morse/find/FindMPIEXT.cmake b/cmake_modules/morse/find/FindMPIEXT.cmake new file mode 100644 index 0000000000000000000000000000000000000000..68520a478eb4bef8943830a93830a73994b3ad07 --- /dev/null +++ b/cmake_modules/morse/find/FindMPIEXT.cmake @@ -0,0 +1,120 @@ +# - Find MPI EXTENDED for MORSE projects: +# +# This module allows to find MPI libraries by calling the official FindMPI module +# and adds an additional variable indicating the level of thread supported: +# MPI_THREAD_SUPPORTED_LEVEL - MPI_THREAD_MULTIPLE, MPI_THREAD_SERIALIZED, MPI_THREAD_FUNNELED, or MPI_THREAD_SINGLE + +#============================================================================= +# Copyright 2012-2013 Inria +# Copyright 2012-2013 Emmanuel Agullo +# Copyright 2012-2013 Mathieu Faverge +# Copyright 2012 Cedric Castagnede +# Copyright 2013 Florent Pruvost +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file MORSE-Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of Morse, substitute the full +# License text for the above reference.) + +# add a cache variable to let the user specify the BLAS vendor +if (NOT MPI_FOUND) + if(MPIEXT_FIND_REQUIRED) + find_package(MPI REQUIRED) + else() + find_package(MPI) + endif() +endif () + +if (MPI_FOUND) + set(CMAKE_REQUIRED_INCLUDES_SAVE ${CMAKE_REQUIRED_INCLUDES}) + set(CMAKE_REQUIRED_LIBRARIES_SAVE ${CMAKE_REQUIRED_LIBRARIES}) + set(CMAKE_REQUIRED_FLAGS_SAVE ${CMAKE_REQUIRED_FLAGS}) + # Set flags for building test program + set(CMAKE_REQUIRED_INCLUDES ${MPI_INCLUDE_PATH}) + set(CMAKE_REQUIRED_LIBRARIES ${MPI_LIBRARIES}) + set(CMAKE_REQUIRED_FLAGS ${MPI_COMPILE_FLAGS}) + + include(CheckCSourceRuns) + set(MPI_C_TEST_MULTIPLE_SOURCE " +#include <stdio.h> +#include <mpi.h> + +int main(int argc, char **argv) { + int provided; + + MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE, &provided); + + if (MPI_THREAD_MULTIPLE > provided) { + fprintf(stderr,\"MPI implementation is not supporting MPI_THREAD_MULTIPLE\"); + MPI_Finalize(); + return 1000+MPI_THREAD_MULTIPLE-provided; + } + MPI_Finalize(); + return 0; +} +") + + set(MPI_C_TEST_SERIALIZED_SOURCE " +#include <stdio.h> +#include <mpi.h> + +int main(int argc, char **argv) { + int provided; + + MPI_Init_thread(&argc, &argv, MPI_THREAD_SERIALIZED, &provided); + + if (MPI_THREAD_SERIALIZED > provided) { + printf(\"MPI implementation is not supporting MPI_THREAD_SERIALIZED\"); + MPI_Finalize(); + return 1; + } + MPI_Finalize(); + return 0; +} +") + + set(MPI_C_TEST_FUNNELED_SOURCE " +#include <stdio.h> +#include <mpi.h> + +int main(int argc, char **argv) { + int provided; + + MPI_Init_thread(&argc, &argv, MPI_THREAD_FUNNELED, &provided); + + if (MPI_THREAD_FUNNELED > provided) { + printf(\"MPI implementation is not supporting MPI_THREAD_FUNNELED\"); + MPI_Finalize(); + return 1; + } + MPI_Finalize(); + return 0; +} +") + + check_c_source_runs("${MPI_C_TEST_MULTIPLE_SOURCE}" MULTIPLE_TEST_RUNS) + if(NOT MULTIPLE_TEST_RUNS) + check_c_source_runs("${MPI_C_TEST_SERIALIZED_SOURCE}" SERIALIZED_TEST_RUNS) + if(NOT SERIALIZED_TEST_RUNS) + check_c_source_runs("${MPI_C_TEST_FUNNELED_SOURCE}" FUNNELED_TEST_RUNS) + if(NOT FUNNELED_TEST_RUNS) + set(MPI_THREAD_SUPPORTED_LEVEL "MPI_THREAD_SINGLE") + else(NOT FUNNELED_TEST_RUNS) + set(MPI_THREAD_SUPPORTED_LEVEL "MPI_THREAD_FUNNELED") + endif(NOT FUNNELED_TEST_RUNS) + else(NOT SERIALIZED_TEST_RUNS) + set(MPI_THREAD_SUPPORTED_LEVEL "MPI_THREAD_SERIALIZED") + endif(NOT SERIALIZED_TEST_RUNS) + else(NOT MULTIPLE_TEST_RUNS) + set(MPI_THREAD_SUPPORTED_LEVEL "MPI_THREAD_MULTIPLE") + endif(NOT MULTIPLE_TEST_RUNS) + # Set flags for building test program + set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES_SAVE}) + set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES_SAVE}) + set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE}) +endif(MPI_FOUND) \ No newline at end of file