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 в три этапа:
- Проверка наличия поддержки MPI в компиляторе. Это происходит, если пользователь передал обёртку компилятора как
CMAKE_<LANG>_COMPILERили если он работает на системе Cray. - Попытка найти обёртку компилятора MPI и определить информацию о компиляторе из неё.
- Попытка найти реализацию 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