|
|
@@ -5,7 +5,11 @@
|
|
|
FindMPI
|
|
|
-------
|
|
|
|
|
|
-Find a Message Passing Interface (MPI) implementation.
|
|
|
+Finds a Message Passing Interface (MPI) implementation:
|
|
|
+
|
|
|
+.. code-block:: cmake
|
|
|
+
|
|
|
+ find_package(MPI [<version>] [COMPONENTS <langs>...] [...])
|
|
|
|
|
|
The Message Passing Interface (MPI) is a library used to write
|
|
|
high-performance distributed-memory parallel applications, and is
|
|
|
@@ -14,253 +18,409 @@ by the MPI forum) for which many implementations are available.
|
|
|
|
|
|
.. versionadded:: 3.10
|
|
|
Major overhaul of the module: many new variables, per-language components,
|
|
|
- support for a wider variety of runtimes.
|
|
|
+ and support for a wider variety of runtimes.
|
|
|
+
|
|
|
+Components
|
|
|
+^^^^^^^^^^
|
|
|
+
|
|
|
+This module supports optional components that can be specified with the
|
|
|
+:command:`find_package` command to control which MPI languages to search
|
|
|
+for:
|
|
|
+
|
|
|
+.. code-block:: cmake
|
|
|
+
|
|
|
+ find_package(MPI [COMPONENTS <langs>...])
|
|
|
+
|
|
|
+Supported components include:
|
|
|
+
|
|
|
+``C``
|
|
|
+ .. versionadded:: 3.10
|
|
|
+
|
|
|
+ Finds MPI C API.
|
|
|
+
|
|
|
+``CXX``
|
|
|
+ .. versionadded:: 3.10
|
|
|
+
|
|
|
+ Finds the MPI C API that is usable from C++.
|
|
|
+
|
|
|
+``MPICXX``
|
|
|
+ .. versionadded:: 3.10
|
|
|
+
|
|
|
+ Finds the MPI-2 C++ API that was removed in MPI-3.
|
|
|
+
|
|
|
+``Fortran``
|
|
|
+ .. versionadded:: 3.10
|
|
|
+
|
|
|
+ Finds the MPI Fortran API.
|
|
|
+
|
|
|
+If no components are specified, module searches for the ``C``, ``CXX``, and
|
|
|
+``Fortran`` components automatically, depending on which languages are
|
|
|
+enabled in the project.
|
|
|
+
|
|
|
+Imported Targets
|
|
|
+^^^^^^^^^^^^^^^^
|
|
|
+
|
|
|
+This module provides the following :ref:`Imported Targets`:
|
|
|
|
|
|
-Variables for using MPI
|
|
|
-^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
+``MPI::MPI_<lang>``
|
|
|
+ .. versionadded:: 3.9
|
|
|
+
|
|
|
+ Target encapsulating usage requirements for using MPI from language
|
|
|
+ ``<lang>``, available if MPI is found. The ``<lang>`` is a specified
|
|
|
+ component name as listed above.
|
|
|
|
|
|
-The module exposes the components ``C``, ``CXX``, ``MPICXX`` and ``Fortran``.
|
|
|
-Each of these controls the various MPI languages to search for.
|
|
|
-The difference between ``CXX`` and ``MPICXX`` is that ``CXX`` refers to the
|
|
|
-MPI C API being usable from C++, whereas ``MPICXX`` refers to the MPI-2 C++ API
|
|
|
-that was removed again in MPI-3.
|
|
|
+Result Variables
|
|
|
+^^^^^^^^^^^^^^^^
|
|
|
|
|
|
-Depending on the enabled components the following variables will be set:
|
|
|
+This module defines the following variables:
|
|
|
|
|
|
``MPI_FOUND``
|
|
|
- Variable indicating that MPI settings for all requested languages have been found.
|
|
|
- If no components are specified, this is true if MPI settings for all enabled languages
|
|
|
- were detected. Note that the ``MPICXX`` component does not affect this variable.
|
|
|
+ Boolean variable indicating that MPI settings for all requested components
|
|
|
+ (languages) have been found. If no components are specified, this is
|
|
|
+ true if MPI settings for all enabled languages were detected. Note that
|
|
|
+ the ``MPICXX`` component does not affect this variable.
|
|
|
+
|
|
|
``MPI_VERSION``
|
|
|
- Minimal version of MPI detected among the requested languages, or all enabled languages
|
|
|
- if no components were specified.
|
|
|
+ Minimal version of MPI detected among the requested languages, or all
|
|
|
+ enabled languages if no components were specified.
|
|
|
|
|
|
-This module will set the following variables per language in your
|
|
|
-project, where ``<lang>`` is one of C, CXX, or Fortran:
|
|
|
+This module will set the following variables per language in CMake project,
|
|
|
+where ``<lang>`` is one of C, CXX, or Fortran:
|
|
|
|
|
|
``MPI_<lang>_FOUND``
|
|
|
- Variable indicating the MPI settings for ``<lang>`` were found and that
|
|
|
- simple MPI test programs compile with the provided settings.
|
|
|
+ Boolean variable indicating the MPI settings for ``<lang>`` were found
|
|
|
+ and that simple MPI test programs compile with the provided settings.
|
|
|
+
|
|
|
``MPI_<lang>_COMPILER``
|
|
|
MPI compiler for ``<lang>`` if such a program exists.
|
|
|
+
|
|
|
``MPI_<lang>_COMPILE_OPTIONS``
|
|
|
- Compilation options for MPI programs in ``<lang>``, given as a :ref:`;-list <CMake Language Lists>`.
|
|
|
+ Compilation options for MPI programs in ``<lang>``, given as a
|
|
|
+ :ref:`semicolon-separated list <CMake Language Lists>`.
|
|
|
+
|
|
|
``MPI_<lang>_COMPILE_DEFINITIONS``
|
|
|
- Compilation definitions for MPI programs in ``<lang>``, given as a :ref:`;-list <CMake Language Lists>`.
|
|
|
+ Compilation definitions for MPI programs in ``<lang>``, given as a
|
|
|
+ :ref:`semicolon-separated list <CMake Language Lists>`.
|
|
|
+
|
|
|
``MPI_<lang>_INCLUDE_DIRS``
|
|
|
Include path(s) for MPI header.
|
|
|
+
|
|
|
``MPI_<lang>_LINK_FLAGS``
|
|
|
Linker flags for MPI programs.
|
|
|
+
|
|
|
``MPI_<lang>_LIBRARIES``
|
|
|
All libraries to link MPI programs against.
|
|
|
|
|
|
-.. versionadded:: 3.9
|
|
|
- Additionally, the following :prop_tgt:`IMPORTED` targets are defined:
|
|
|
-
|
|
|
-``MPI::MPI_<lang>``
|
|
|
- Target for using MPI from ``<lang>``.
|
|
|
-
|
|
|
-The following variables indicating which bindings are present will be defined:
|
|
|
+The following variables indicating which bindings are present will be
|
|
|
+defined:
|
|
|
|
|
|
``MPI_MPICXX_FOUND``
|
|
|
- Variable indicating whether the MPI-2 C++ bindings are present (introduced in MPI-2, removed with MPI-3).
|
|
|
+ Boolean variable indicating whether the MPI-2 C++ bindings are present
|
|
|
+ (introduced in MPI-2, removed with MPI-3).
|
|
|
+
|
|
|
``MPI_Fortran_HAVE_F77_HEADER``
|
|
|
- True if the Fortran 77 header ``mpif.h`` is available.
|
|
|
+ True if the Fortran 77 header ``<mpif.h>`` is available.
|
|
|
+
|
|
|
``MPI_Fortran_HAVE_F90_MODULE``
|
|
|
- True if the Fortran 90 module ``mpi`` can be used for accessing MPI (MPI-2 and higher only).
|
|
|
+ True if the Fortran 90 module ``mpi`` can be used for accessing MPI (MPI-2
|
|
|
+ and higher only).
|
|
|
+
|
|
|
``MPI_Fortran_HAVE_F08_MODULE``
|
|
|
- True if the Fortran 2008 ``mpi_f08`` is available to MPI programs (MPI-3 and higher only).
|
|
|
+ True if the Fortran 2008 ``mpi_f08`` is available to MPI programs (MPI-3
|
|
|
+ and higher only).
|
|
|
|
|
|
-If possible, the MPI version will be determined by this module. The facilities to detect the MPI version
|
|
|
-were introduced with MPI-1.2, and therefore cannot be found for older MPI versions.
|
|
|
+If possible, the MPI version will be determined by this module. The
|
|
|
+facilities to detect the MPI version were introduced with MPI-1.2, and
|
|
|
+therefore cannot be found for older MPI versions.
|
|
|
+
|
|
|
+``MPI_<lang>_VERSION``
|
|
|
+ MPI version implemented for ``<lang>`` by the MPI distribution.
|
|
|
|
|
|
``MPI_<lang>_VERSION_MAJOR``
|
|
|
Major version of MPI implemented for ``<lang>`` by the MPI distribution.
|
|
|
+
|
|
|
``MPI_<lang>_VERSION_MINOR``
|
|
|
Minor version of MPI implemented for ``<lang>`` by the MPI distribution.
|
|
|
-``MPI_<lang>_VERSION``
|
|
|
- MPI version implemented for ``<lang>`` by the MPI distribution.
|
|
|
|
|
|
-Note that there's no variable for the C bindings being accessible through ``mpi.h``, since the MPI standards
|
|
|
-always have required this binding to work in both C and C++ code.
|
|
|
+Note that there's no variable for the C bindings being accessible through
|
|
|
+``<mpi.h>``, since the MPI standards always have required this binding to
|
|
|
+work in both C and C++ code.
|
|
|
|
|
|
-For running MPI programs, the module sets the following variables
|
|
|
+For running MPI programs, the module sets the following variables:
|
|
|
|
|
|
``MPIEXEC_EXECUTABLE``
|
|
|
Executable for running MPI programs, if such exists.
|
|
|
+
|
|
|
``MPIEXEC_NUMPROC_FLAG``
|
|
|
- Flag to pass to ``mpiexec`` before giving it the number of processors to run on.
|
|
|
+ Flag to pass to ``mpiexec`` before giving it the number of processors to
|
|
|
+ run on.
|
|
|
+
|
|
|
``MPIEXEC_MAX_NUMPROCS``
|
|
|
- Number of MPI processors to utilize. Defaults to the number
|
|
|
- of processors detected on the host system.
|
|
|
+ Number of MPI processors to utilize. Defaults to the number of
|
|
|
+ processors detected on the host system.
|
|
|
+
|
|
|
``MPIEXEC_PREFLAGS``
|
|
|
Flags to pass to ``mpiexec`` directly before the executable to run.
|
|
|
+
|
|
|
``MPIEXEC_POSTFLAGS``
|
|
|
Flags to pass to ``mpiexec`` after other flags.
|
|
|
|
|
|
-Variables for locating MPI
|
|
|
+Variables for Locating MPI
|
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
|
-This module performs a four step search for an MPI implementation:
|
|
|
+This module performs a four-step search for an MPI implementation:
|
|
|
|
|
|
-1. Search for ``MPIEXEC_EXECUTABLE`` and, if found, use its base directory.
|
|
|
-2. Check if the compiler has MPI support built-in. This is the case if the user passed a
|
|
|
- compiler wrapper as ``CMAKE_<LANG>_COMPILER`` or if they use Cray system compiler wrappers.
|
|
|
-3. Attempt to find an MPI compiler wrapper and determine the compiler information from it.
|
|
|
-4. Try to find an MPI implementation that does not ship such a wrapper by guessing settings.
|
|
|
- Currently, only Microsoft MPI and MPICH2 on Windows are supported.
|
|
|
+1. Searches for ``MPIEXEC_EXECUTABLE`` and, if found, uses its base
|
|
|
+ directory.
|
|
|
+2. Checks if the compiler has MPI support built-in. This is the case if
|
|
|
+ the user passed a compiler wrapper as :variable:`CMAKE_<LANG>_COMPILER`
|
|
|
+ or if they use Cray system compiler wrappers.
|
|
|
+3. Attempts to find an MPI compiler wrapper and determines the compiler
|
|
|
+ information from it.
|
|
|
+4. Tries to find an MPI implementation that does not ship such a wrapper by
|
|
|
+ guessing settings. Currently, only Microsoft MPI and MPICH2 on Windows
|
|
|
+ are supported.
|
|
|
|
|
|
-For controlling the ``MPIEXEC_EXECUTABLE`` step, the following variables may be set:
|
|
|
+For controlling the ``MPIEXEC_EXECUTABLE`` step, the following variables
|
|
|
+may be set:
|
|
|
|
|
|
``MPIEXEC_EXECUTABLE``
|
|
|
Manually specify the location of ``mpiexec``.
|
|
|
+
|
|
|
``MPI_HOME``
|
|
|
Specify the base directory of the MPI installation.
|
|
|
+
|
|
|
``ENV{MPI_HOME}``
|
|
|
Environment variable to specify the base directory of the MPI installation.
|
|
|
+
|
|
|
``ENV{I_MPI_ROOT}``
|
|
|
Environment variable to specify the base directory of the MPI installation.
|
|
|
|
|
|
-For controlling the compiler wrapper step, the following variables may be set:
|
|
|
+For controlling the compiler wrapper step, the following variables may be
|
|
|
+set:
|
|
|
|
|
|
``MPI_<lang>_COMPILER``
|
|
|
Search for the specified compiler wrapper and use it.
|
|
|
+
|
|
|
``MPI_<lang>_COMPILER_FLAGS``
|
|
|
- Flags to pass to the MPI compiler wrapper during interrogation. Some compiler wrappers
|
|
|
- support linking debug or tracing libraries if a specific flag is passed and this variable
|
|
|
- may be used to obtain them.
|
|
|
+ Flags to pass to the MPI compiler wrapper during interrogation. Some
|
|
|
+ compiler wrappers support linking debug or tracing libraries if a specific
|
|
|
+ flag is passed and this variable may be used to obtain them.
|
|
|
+
|
|
|
``MPI_COMPILER_FLAGS``
|
|
|
- Used to initialize ``MPI_<lang>_COMPILER_FLAGS`` if no language specific flag has been given.
|
|
|
- Empty by default.
|
|
|
+ Used to initialize ``MPI_<lang>_COMPILER_FLAGS`` if no language specific
|
|
|
+ flag has been given. Empty by default.
|
|
|
+
|
|
|
``MPI_EXECUTABLE_SUFFIX``
|
|
|
- A suffix which is appended to all names that are being looked for. For instance you may set this
|
|
|
- to ``.mpich`` or ``.openmpi`` to prefer the one or the other on Debian and its derivatives.
|
|
|
+ A suffix which is appended to all names that are being looked for. For
|
|
|
+ instance, it may be set to ``.mpich`` or ``.openmpi`` to prefer the one
|
|
|
+ or the other on Debian and its derivatives.
|
|
|
|
|
|
In order to control the guessing step, the following variable may be set:
|
|
|
|
|
|
``MPI_GUESS_LIBRARY_NAME``
|
|
|
- Valid values are ``MSMPI`` and ``MPICH2``. If set, only the given library will be searched for.
|
|
|
- By default, ``MSMPI`` will be preferred over ``MPICH2`` if both are available.
|
|
|
- This also sets ``MPI_SKIP_COMPILER_WRAPPER`` to ``true``, which may be overridden.
|
|
|
+ Valid values are ``MSMPI`` and ``MPICH2``. If set, only the given library
|
|
|
+ will be searched for. By default, ``MSMPI`` will be preferred over
|
|
|
+ ``MPICH2`` if both are available. This also sets
|
|
|
+ ``MPI_SKIP_COMPILER_WRAPPER`` variable to ``true``, which may be
|
|
|
+ overridden.
|
|
|
|
|
|
Each of the search steps may be skipped with the following control variables:
|
|
|
|
|
|
``MPI_ASSUME_NO_BUILTIN_MPI``
|
|
|
- If true, the module assumes that the compiler itself does not provide an MPI implementation and
|
|
|
- skips to step 2.
|
|
|
+ If true, the module assumes that the compiler itself does not provide an
|
|
|
+ MPI implementation and skips to step 2.
|
|
|
+
|
|
|
``MPI_SKIP_COMPILER_WRAPPER``
|
|
|
If true, no compiler wrapper will be searched for.
|
|
|
+
|
|
|
``MPI_SKIP_GUESSING``
|
|
|
If true, the guessing step will be skipped.
|
|
|
|
|
|
-Additionally, the following control variable is available to change search behavior:
|
|
|
+Additionally, the following control variable is available to change search
|
|
|
+behavior:
|
|
|
|
|
|
``MPI_CXX_SKIP_MPICXX``
|
|
|
Add some definitions that will disable the MPI-2 C++ bindings.
|
|
|
- Currently supported are MPICH, Open MPI, Platform MPI and derivatives thereof,
|
|
|
- for example MVAPICH or Intel MPI.
|
|
|
+ Currently supported are MPICH, Open MPI, Platform MPI and derivatives
|
|
|
+ thereof, for example, MVAPICH or Intel MPI.
|
|
|
+
|
|
|
+If the find procedure fails for the module's internal variable
|
|
|
+``MPI_<lang>_WORKS``, then the settings detected by or passed to the module
|
|
|
+did not work and even a simple MPI test program failed to compile.
|
|
|
|
|
|
-If the find procedure fails for a variable ``MPI_<lang>_WORKS``, then the settings detected by or passed to
|
|
|
-the module did not work and even a simple MPI test program failed to compile.
|
|
|
+If all of these parameters were not sufficient to find the right MPI
|
|
|
+implementation, a user may disable the entire autodetection process by
|
|
|
+specifying both a list of libraries in ``MPI_<lang>_LIBRARIES`` and a list
|
|
|
+of include directories in ``MPI_<lang>_ADDITIONAL_INCLUDE_DIRS``. Any other
|
|
|
+variable may be set in addition to these two. The module will then validate
|
|
|
+the MPI settings and store the settings in the cache.
|
|
|
|
|
|
-If all of these parameters were not sufficient to find the right MPI implementation, a user may
|
|
|
-disable the entire autodetection process by specifying both a list of libraries in ``MPI_<lang>_LIBRARIES``
|
|
|
-and a list of include directories in ``MPI_<lang>_ADDITIONAL_INCLUDE_DIRS``.
|
|
|
-Any other variable may be set in addition to these two. The module will then validate the MPI settings and store the
|
|
|
-settings in the cache.
|
|
|
+Cache Variables
|
|
|
+^^^^^^^^^^^^^^^
|
|
|
|
|
|
-Cache variables for MPI
|
|
|
-^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
+The variable ``MPI_<lang>_INCLUDE_DIRS`` will be assembled from the
|
|
|
+following variables.
|
|
|
|
|
|
-The variable ``MPI_<lang>_INCLUDE_DIRS`` will be assembled from the following variables.
|
|
|
For C and CXX:
|
|
|
|
|
|
``MPI_<lang>_HEADER_DIR``
|
|
|
- Location of the ``mpi.h`` header on disk.
|
|
|
+ Location of the ``<mpi.h>`` header on disk.
|
|
|
|
|
|
For Fortran:
|
|
|
|
|
|
``MPI_Fortran_F77_HEADER_DIR``
|
|
|
- Location of the Fortran 77 header ``mpif.h``, if it exists.
|
|
|
+ Location of the Fortran 77 header ``<mpif.h>``, if it exists.
|
|
|
+
|
|
|
``MPI_Fortran_MODULE_DIR``
|
|
|
Location of the ``mpi`` or ``mpi_f08`` modules, if available.
|
|
|
|
|
|
For all languages the following variables are additionally considered:
|
|
|
|
|
|
``MPI_<lang>_ADDITIONAL_INCLUDE_DIRS``
|
|
|
- A :ref:`;-list <CMake Language Lists>` of paths needed in addition to the normal include directories.
|
|
|
-``MPI_<include_name>_INCLUDE_DIR``
|
|
|
- Path variables for include folders referred to by ``<include_name>``.
|
|
|
+ A :ref:`semicolon-separated list <CMake Language Lists>` of paths needed
|
|
|
+ in addition to the normal include directories.
|
|
|
+
|
|
|
+``MPI_<include-name>_INCLUDE_DIR``
|
|
|
+ Path variables for include folders referred to by ``<include-name>``.
|
|
|
+
|
|
|
``MPI_<lang>_ADDITIONAL_INCLUDE_VARS``
|
|
|
- A :ref:`;-list <CMake Language Lists>` of ``<include_name>`` that will be added to the include locations of ``<lang>``.
|
|
|
+ A :ref:`semicolon-separated list <CMake Language Lists>` of
|
|
|
+ ``<include-name>`` that will be added to the include locations of
|
|
|
+ ``<lang>``.
|
|
|
+
|
|
|
+The variable ``MPI_<lang>_LIBRARIES`` will be assembled from the following
|
|
|
+variables:
|
|
|
|
|
|
-The variable ``MPI_<lang>_LIBRARIES`` will be assembled from the following variables:
|
|
|
+``MPI_<lib-name>_LIBRARY``
|
|
|
+ The location of a library called ``<lib-name>`` for use with MPI.
|
|
|
|
|
|
-``MPI_<lib_name>_LIBRARY``
|
|
|
- The location of a library called ``<lib_name>`` for use with MPI.
|
|
|
``MPI_<lang>_LIB_NAMES``
|
|
|
- A :ref:`;-list <CMake Language Lists>` of ``<lib_name>`` that will be added to the include locations of ``<lang>``.
|
|
|
+ A :ref:`semicolon-separated list <CMake Language Lists>` of ``<lib-name>``
|
|
|
+ that will be added to the include locations of ``<lang>``.
|
|
|
|
|
|
-Usage of mpiexec
|
|
|
-^^^^^^^^^^^^^^^^
|
|
|
+Advanced Variables for Using MPI
|
|
|
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
|
-When using ``MPIEXEC_EXECUTABLE`` to execute MPI applications, you should typically
|
|
|
-use all of the ``MPIEXEC_EXECUTABLE`` flags as follows:
|
|
|
+The module can perform some advanced feature detections upon explicit
|
|
|
+request.
|
|
|
|
|
|
-.. code-block:: cmake
|
|
|
+.. note::
|
|
|
|
|
|
- ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} ${MPIEXEC_MAX_NUMPROCS}
|
|
|
- ${MPIEXEC_PREFLAGS} EXECUTABLE ${MPIEXEC_POSTFLAGS} ARGS
|
|
|
+ The following checks cannot be performed without *executing* an MPI test
|
|
|
+ program. Consider the special considerations for the behavior of
|
|
|
+ :command:`try_run` during cross compilation. Moreover, running an MPI
|
|
|
+ program can cause additional issues, like a firewall notification on some
|
|
|
+ systems. These detections should be only enabled if information is
|
|
|
+ absolutely needed.
|
|
|
|
|
|
-where ``EXECUTABLE`` is the MPI program, and ``ARGS`` are the arguments to
|
|
|
-pass to the MPI program.
|
|
|
+If the following variables are set to true, the respective search will be
|
|
|
+performed:
|
|
|
|
|
|
-Advanced variables for using MPI
|
|
|
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
+``MPI_DETERMINE_Fortran_CAPABILITIES``
|
|
|
+ Determine for all available Fortran bindings what the values of
|
|
|
+ ``MPI_SUBARRAYS_SUPPORTED`` and ``MPI_ASYNC_PROTECTS_NONBLOCKING`` are
|
|
|
+ and make their values available as ``MPI_Fortran_<binding>_SUBARRAYS``
|
|
|
+ and ``MPI_Fortran_<binding>_ASYNCPROT``, where ``<binding>`` is one of
|
|
|
+ ``F77_HEADER``, ``F90_MODULE`` and ``F08_MODULE``.
|
|
|
|
|
|
-The module can perform some advanced feature detections upon explicit request.
|
|
|
+``MPI_DETERMINE_LIBRARY_VERSION``
|
|
|
+ For each language, find the output of ``MPI_Get_library_version`` and
|
|
|
+ make it available as ``MPI_<lang>_LIBRARY_VERSION_STRING``. This
|
|
|
+ information is usually tied to the runtime component of an MPI
|
|
|
+ implementation and might differ depending on ``<lang>``.
|
|
|
+ Note that the return value is entirely implementation defined. This
|
|
|
+ information might be used to identify the MPI vendor and for example pick
|
|
|
+ the correct one of multiple third party binaries that matches the MPI
|
|
|
+ vendor.
|
|
|
|
|
|
-**Important notice:** The following checks cannot be performed without *executing* an MPI test program.
|
|
|
-Consider the special considerations for the behavior of :command:`try_run` during cross compilation.
|
|
|
-Moreover, running an MPI program can cause additional issues, like a firewall notification on some systems.
|
|
|
-You should only enable these detections if you absolutely need the information.
|
|
|
+Deprecated Variables
|
|
|
+^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
|
-If the following variables are set to true, the respective search will be performed:
|
|
|
+The following variables are provided for backward compatibility:
|
|
|
|
|
|
-``MPI_DETERMINE_Fortran_CAPABILITIES``
|
|
|
- Determine for all available Fortran bindings what the values of ``MPI_SUBARRAYS_SUPPORTED`` and
|
|
|
- ``MPI_ASYNC_PROTECTS_NONBLOCKING`` are and make their values available as ``MPI_Fortran_<binding>_SUBARRAYS``
|
|
|
- and ``MPI_Fortran_<binding>_ASYNCPROT``, where ``<binding>`` is one of ``F77_HEADER``, ``F90_MODULE`` and
|
|
|
- ``F08_MODULE``.
|
|
|
-``MPI_DETERMINE_LIBRARY_VERSION``
|
|
|
- For each language, find the output of ``MPI_Get_library_version`` and make it available as ``MPI_<lang>_LIBRARY_VERSION_STRING``.
|
|
|
- This information is usually tied to the runtime component of an MPI implementation and might differ depending on ``<lang>``.
|
|
|
- Note that the return value is entirely implementation defined. This information might be used to identify
|
|
|
- the MPI vendor and for example pick the correct one of multiple third party binaries that matches the MPI vendor.
|
|
|
+``MPI_COMPILER``
|
|
|
+ .. deprecated:: 2.8.5
|
|
|
+ Use the ``MPI_<lang>_COMPILER`` instead.
|
|
|
|
|
|
-Backward Compatibility
|
|
|
-^^^^^^^^^^^^^^^^^^^^^^
|
|
|
+``MPI_LIBRARY``
|
|
|
+ .. deprecated:: 2.8.5
|
|
|
+ Use the ``MPI_<lang>_LIBRARIES`` instead.
|
|
|
|
|
|
-.. deprecated:: 3.10
|
|
|
+``MPI_EXTRA_LIBRARY``
|
|
|
+ .. deprecated:: 2.8.5
|
|
|
+ Use the ``MPI_<lang>_LIBRARIES`` instead.
|
|
|
|
|
|
-For backward compatibility with older versions of FindMPI, these
|
|
|
-variables are set:
|
|
|
+``MPI_COMPILE_FLAGS``
|
|
|
+ .. deprecated:: 2.8.5
|
|
|
+ Use ``MPI_<lang>_COMPILE_OPTIONS`` and ``MPI_<lang>_COMPILE_DEFINITIONS``
|
|
|
+ instead.
|
|
|
|
|
|
-::
|
|
|
+``MPI_INCLUDE_PATH``
|
|
|
+ .. deprecated:: 2.8.5
|
|
|
+ Use the ``MPI_<lang>_INCLUDE_DIRS`` instead.
|
|
|
|
|
|
- MPI_COMPILER MPI_LIBRARY MPI_EXTRA_LIBRARY
|
|
|
- MPI_COMPILE_FLAGS MPI_INCLUDE_PATH MPI_LINK_FLAGS
|
|
|
- MPI_LIBRARIES
|
|
|
+``MPI_LINK_FLAGS``
|
|
|
+ .. deprecated:: 2.8.5
|
|
|
+ Use the ``MPI_<lang>_LINK_FLAGS`` instead.
|
|
|
|
|
|
-In new projects, please use the ``MPI_<lang>_XXX`` equivalents.
|
|
|
-Additionally, the following variables are deprecated:
|
|
|
+``MPI_LIBRARIES``
|
|
|
+ .. deprecated:: 2.8.5
|
|
|
+ Use the ``MPI_<lang>_LIBRARIES`` instead.
|
|
|
|
|
|
``MPI_<lang>_COMPILE_FLAGS``
|
|
|
- Use ``MPI_<lang>_COMPILE_OPTIONS`` and ``MPI_<lang>_COMPILE_DEFINITIONS`` instead.
|
|
|
+ .. deprecated:: 3.10
|
|
|
+ Use the ``MPI_<lang>_COMPILE_OPTIONS`` and
|
|
|
+ ``MPI_<lang>_COMPILE_DEFINITIONS`` instead.
|
|
|
+
|
|
|
``MPI_<lang>_INCLUDE_PATH``
|
|
|
- For consumption use ``MPI_<lang>_INCLUDE_DIRS`` and for specifying folders use ``MPI_<lang>_ADDITIONAL_INCLUDE_DIRS`` instead.
|
|
|
+ .. deprecated:: 3.10
|
|
|
+ For consumption use ``MPI_<lang>_INCLUDE_DIRS`` and for specifying
|
|
|
+ folders use ``MPI_<lang>_ADDITIONAL_INCLUDE_DIRS`` instead.
|
|
|
+
|
|
|
``MPIEXEC``
|
|
|
- Use ``MPIEXEC_EXECUTABLE`` instead.
|
|
|
+ .. deprecated:: 3.10
|
|
|
+ Use ``MPIEXEC_EXECUTABLE`` instead.
|
|
|
+
|
|
|
+Examples
|
|
|
+^^^^^^^^
|
|
|
+
|
|
|
+Example: Basic Usage
|
|
|
+""""""""""""""""""""
|
|
|
+
|
|
|
+Finding MPI and linking imported target to project target:
|
|
|
+
|
|
|
+.. code-block:: cmake
|
|
|
+
|
|
|
+ find_package(MPI)
|
|
|
+ target_link_libraries(example PRIVATE MPI::MPI_C)
|
|
|
+
|
|
|
+Example: Usage of mpiexec
|
|
|
+"""""""""""""""""""""""""
|
|
|
+
|
|
|
+When using ``MPIEXEC_EXECUTABLE`` to execute MPI applications, typically
|
|
|
+all of the ``MPIEXEC_EXECUTABLE`` flags should be used as follows.
|
|
|
+
|
|
|
+In the following example, the command is executed in a process.
|
|
|
+``<executable>`` should be replaced with the MPI program, and ``<args>``
|
|
|
+with the arguments to pass to the MPI program.
|
|
|
+
|
|
|
+.. code-block:: cmake
|
|
|
+
|
|
|
+ find_package(MPI)
|
|
|
+
|
|
|
+ if(MPI_FOUND)
|
|
|
+ execute_process(
|
|
|
+ COMMAND
|
|
|
+ ${MPIEXEC_EXECUTABLE}
|
|
|
+ ${MPIEXEC_NUMPROC_FLAG}
|
|
|
+ ${MPIEXEC_MAX_NUMPROCS}
|
|
|
+ ${MPIEXEC_PREFLAGS}
|
|
|
+ <executable>
|
|
|
+ ${MPIEXEC_POSTFLAGS}
|
|
|
+ <args>
|
|
|
+ )
|
|
|
+ endif()
|
|
|
#]=======================================================================]
|
|
|
|
|
|
cmake_policy(PUSH)
|
|
|
@@ -982,7 +1142,7 @@ function(_MPI_guess_settings LANG)
|
|
|
|
|
|
# Our strategy is now to locate all libraries, but enter msmpifec into the LIB_NAMES array.
|
|
|
# Should this not be adequate it's a straightforward way for a user to change the LIB_NAMES array and
|
|
|
- # have his library found. Still, this should not be necessary outside of exceptional cases, as reasoned.
|
|
|
+ # have their library found. Still, this should not be necessary outside of exceptional cases, as reasoned.
|
|
|
if (LANG STREQUAL "Fortran")
|
|
|
set(MPI_MSMPI_CALLINGCONVS c)
|
|
|
if(CMAKE_SIZEOF_VOID_P EQUAL "4")
|