Spec-Zone.ru › CMake 3.13

FindMPI

Найдите реализацию Message Passing Interface (MPI).

Message Passing Interface (MPI) — это библиотека, используемая для написания высокопроизводительных параллельных приложений с распределённой памятью, обычно развёртываемых на кластере. MPI — это стандартный интерфейс (определённый форумом MPI), для которого доступно множество реализаций.

Переменные для использования MPI

Модуль раскрывает компоненты C, CXX, MPICXX и Fortran. Каждый из них контролирует различные языки MPI для поиска. Разница между CXX и MPICXX заключается в том, что CXX относится к API MPI C, используемому из C++, а MPICXX относится к API MPI-2 C++, который был вновь удалён в MPI-3.

В зависимости от включённых компонентов будут установлены следующие переменные:

MPI_FOUND
Переменная, указывающая, что настройки MPI для всех запрошенных языков найдены. Если компоненты не указаны, это истинно, если настройки MPI для всех включённых языков были обнаружены. Обратите внимание, что компонент MPICXX не влияет на эту переменную.
MPI_VERSION
Минимальная версия MPI, обнаруженная среди запрошенных языков, или всех включённых языков, если компоненты не были указаны.

Этот модуль установит следующие переменные для каждого языка в вашем проекте, где <lang> — это один из C, CXX или Fortran:

MPI_<lang>_FOUND
Переменная, указывающая, что настройки MPI для <lang> были найдены и что простые тестовые программы MPI компилируются с предоставленными настройками.
MPI_<lang>_COMPILER
Компилятор MPI для <lang>, если такая программа существует.
MPI_<lang>_COMPILE_OPTIONS
Опции компиляции для программ MPI в <lang>, заданные как ;-список.
MPI_<lang>_COMPILE_DEFINITIONS
Определения компиляции для программ MPI в <lang>, заданные как ;-список.
MPI_<lang>_INCLUDE_DIRS
Путь(и) включения для заголовка MPI.
MPI_<lang>_LINK_FLAGS
Флаги компоновщика для программ MPI.
MPI_<lang>_LIBRARIES
Все библиотеки для компоновки программ MPI.

Кроме того, определены следующие IMPORTED целевые объекты:

MPI::MPI_<lang>
Целевой объект для использования MPI из <lang>.

Будут определены следующие переменные, указывающие на наличие библиотек:

MPI_MPICXX_FOUND
Переменная, указывающая, присутствуют ли C++-связующие MPI-2 (введены в MPI-2, удалены в MPI-3).
MPI_Fortran_HAVE_F77_HEADER
Истина, если заголовок Fortran 77 mpif.h доступен.
MPI_Fortran_HAVE_F90_MODULE
Истина, если модуль Fortran 90 mpi может использоваться для доступа к MPI (только MPI-2 и выше).
MPI_Fortran_HAVE_F08_MODULE
Истина, если Fortran 2008 mpi_f08 доступен для программ MPI (только MPI-3 и выше).

Если это возможно, версия MPI будет определена этим модулем. Возможности обнаружения версии MPI были введены с MPI-1.2 и, следовательно, не могут быть найдены для более старых версий MPI.

MPI_<lang>_VERSION_MAJOR
Основная версия MPI, реализованная для <lang> дистрибутивом MPI.
MPI_<lang>_VERSION_MINOR
Дополнительная версия MPI, реализованная для <lang> дистрибутивом MPI.
MPI_<lang>_VERSION
Реализованная версия MPI для <lang> дистрибутивом MPI.

Обратите внимание, что для C-связующих, доступных через mpi.h, переменной нет, так как стандарты MPI всегда требуют, чтобы эти связующие работали как в C-, так и в C++-коде.

Для запуска программ MPI модуль устанавливает следующие переменные

MPIEXEC_EXECUTABLE
Исполняемый файл для запуска программ MPI, если он существует.
MPIEXEC_NUMPROC_FLAG
Флаг, передаваемый mpiexec перед передачей числа процессоров для запуска.
MPIEXEC_MAX_NUMPROCS
Количество процессоров MPI для использования. По умолчанию — количество процессоров, обнаруженных на системе.
MPIEXEC_PREFLAGS
Флаги, передаваемые непосредственно mpiexec перед исполняемым файлом для запуска.
MPIEXEC_POSTFLAGS
Флаги, передаваемые mpiexec после других флагов.

Переменные для поиска MPI

Этот модуль выполняет поиск реализации MPI в три этапа:

  1. Проверка наличия поддержки MPI в компиляторе. Это происходит, если пользователь передал обёртку компилятора как CMAKE_<LANG>_COMPILER или если он работает на системе Cray.
  2. Попытка найти обёртку компилятора MPI и определить информацию о компиляторе из неё.
  3. Попытка найти реализацию MPI, которая не поставляется с такой обёрткой, предполагая настройки. В настоящее время поддерживаются только Microsoft MPI и MPICH2 в Windows.

Для управления вторым шагом могут быть установлены следующие переменные:

MPI_<lang>_COMPILER
Поиск указанной обёртки компилятора и её использование.
MPI_<lang>_COMPILER_FLAGS
Флаги, передаваемые обёртке компилятора MPI во время запроса. Некоторые обёртки компиляторов поддерживают компоновку библиотек отладки или трассировки, если передать определённый флаг, и эта переменная может быть использована для их получения.
MPI_COMPILER_FLAGS
Используется для инициализации MPI_<lang>_COMPILER_FLAGS, если не был передан специфичный для языка флаг. По умолчанию пустая.
MPI_EXECUTABLE_SUFFIX
Суффикс, добавляемый ко всем искомым именам. Например, вы можете установить его в .mpich или .openmpi для выбора одного или другого на системах Debian и её производных.

Для управления шагом угадывания может быть установлена следующая переменная:

MPI_GUESS_LIBRARY_NAME
Допустимые значения — MSMPI и MPICH2. Если установлено, будет осуществляться поиск только указанной библиотеки. По умолчанию MSMPI будет предпочтительнее MPICH2, если обе доступны. Это также установит MPI_SKIP_COMPILER_WRAPPER в true, что может быть переопределено.

Каждый из этапов поиска может быть пропущен с помощью следующих управляющих переменных:

MPI_ASSUME_NO_BUILTIN_MPI
Если истинно, модуль предполагает, что сам компилятор не предоставляет реализацию MPI, и переходит ко второму шагу.
MPI_SKIP_COMPILER_WRAPPER
Если истинно, обёртки компилятора не будет искаться.
MPI_SKIP_GUESSING
Если истинно, шаг угадывания будет пропущен.

Кроме того, для изменения поведения поиска доступна следующая управляющая переменная:

MPI_CXX_SKIP_MPICXX
Добавить некоторые определения, которые отключат C++-связующие MPI-2. В настоящее время поддерживаются MPICH, Open MPI, Platform MPI и их производные, например, MVAPICH или Intel MPI.

Если процедура поиска терпит неудачу для переменной MPI_<lang>_WORKS, значит, настройки, обнаруженные или переданные модулю, не сработали, и даже простая тестовая программа MPI не смогла скомпилироваться.

Если все эти параметры недостаточно для поиска нужной реализации MPI, пользователь может отключить весь процесс автоматического обнаружения, указав список библиотек в MPI_<lang>_LIBRARIES и список каталогов включения в MPI_<lang>_ADDITIONAL_INCLUDE_DIRS. Кроме этих двух, может быть задана любая другая переменная. Модуль затем проверит настройки MPI и сохранит их в кэше.

Переменные кэша для MPI

Переменная MPI_<lang>_INCLUDE_DIRS будет составлена из следующих переменных. Для C и CXX:

MPI_<lang>_HEADER_DIR
Расположение заголовка mpi.h на диске.

Для Fortran:

MPI_Fortran_F77_HEADER_DIR
Расположение заголовка Fortran 77 mpif.h, если он существует.
MPI_Fortran_MODULE_DIR
Расположение модулей mpi или mpi_f08, если они доступны.

Для всех языков дополнительно учитываются следующие переменные:

MPI_<lang>_ADDITIONAL_INCLUDE_DIRS
Список путей, необходимых в дополнение к обычным каталогам включения (разделенные точкой с запятой).
MPI_<include_name>_INCLUDE_DIR
Переменные пути для папок включения, на которые ссылается <include_name>.
MPI_<lang>_ADDITIONAL_INCLUDE_VARS
Список <include_name>, которые будут добавлены к расположениям включения <lang>. (разделенные точкой с запятой).

Переменная MPI_<lang>_LIBRARIES будет составлена из следующих переменных:

MPI_<lib_name>_LIBRARY
Расположение библиотеки под названием <lib_name> для использования с MPI.
MPI_<lang>_LIB_NAMES
Список <lib_name>, которые будут добавлены к расположениям включения <lang>. (разделенные точкой с запятой).

Использование mpiexec

При использовании MPIEXEC_EXECUTABLE для выполнения приложений MPI, как правило, следует использовать все флаги MPIEXEC_EXECUTABLE следующим образом:

${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} ${MPIEXEC_MAX_NUMPROCS}
  ${MPIEXEC_PREFLAGS} EXECUTABLE ${MPIEXEC_POSTFLAGS} ARGS

где EXECUTABLE — это программа MPI, а ARGS — аргументы, передаваемые программе MPI.

Дополнительные переменные для использования MPI

Модуль может выполнять некоторые расширенные проверки по явным запросам.

Важно: следующие проверки не могут быть выполнены без выполнения тестовой программы MPI. Учитывайте особые соображения для поведения try_run() во время кросс-компиляции. Кроме того, выполнение программы MPI может вызвать дополнительные проблемы, например, уведомление брандмауэра на некоторых системах. Вы должны включать эти проверки только в том случае, если вам абсолютно необходима эта информация.

Если следующие переменные установлены в значение истина, будет выполняться соответствующий поиск:

MPI_DETERMINE_Fortran_CAPABILITIES
Определите для всех доступных связующих Fortran значения MPI_SUBARRAYS_SUPPORTED и MPI_ASYNC_PROTECTS_NONBLOCKING и сделайте их доступными как MPI_Fortran_<binding>_SUBARRAYS и MPI_Fortran_<binding>_ASYNCPROT, где <binding> — это один из F77_HEADER, F90_MODULE и F08_MODULE.
MPI_DETERMINE_LIBRARY_VERSION
Для каждого языка найдите вывод MPI_Get_library_version и сделайте его доступным как MPI_<lang>_LIBRARY_VERSION. Эта информация обычно связана с компонентом времени выполнения реализации MPI и может отличаться в зависимости от <lang>. Обратите внимание, что возвращаемое значение полностью определяется реализацией. Эта информация может использоваться для идентификации поставщика MPI и, например, выбора правильного из нескольких сторонних бинарников, соответствующих поставщику MPI.

Обратная совместимость

Для обеспечения обратной совместимости со старыми версиями FindMPI эти переменные установлены, но устарели:

MPI_COMPILER        MPI_LIBRARY        MPI_EXTRA_LIBRARY
MPI_COMPILE_FLAGS   MPI_INCLUDE_PATH   MPI_LINK_FLAGS
MPI_LIBRARIES

В новых проектах, пожалуйста, используйте MPI_<lang>_XXX эквиваленты. Кроме того, следующие переменные устарели:

MPI_<lang>_COMPILE_FLAGS
Используйте MPI_<lang>_COMPILE_OPTIONS и MPI_<lang>_COMPILE_DEFINITIONS вместо этого.
MPI_<lang>_INCLUDE_PATH
Для использования используйте MPI_<lang>_INCLUDE_DIRS, а для указания папок используйте MPI_<lang>_ADDITIONAL_INCLUDE_DIRS вместо этого.
MPIEXEC
Используйте MPIEXEC_EXECUTABLE вместо этого.

© 2000–2019 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.13/module/FindMPI.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API