FindMPI
Поиск реализации Message Passing Interface (MPI).
Message Passing Interface (MPI) — это библиотека, используемая для написания высокопроизводительных распределённых параллельных приложений, как правило, на кластере. MPI — это стандартный интерфейс (определённый MPI форумом), для которого доступно множество реализаций.
Новое в версии 3.10: Глобальная переработка модуля: множество новых переменных, компоненты для разных языков, поддержка более широкого спектра сред выполнения.
Переменные для использования 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.
Новое в версии 3.9: Кроме того, определены следующие IMPORTED цели:
-
MPI::MPI_<lang> -
Целевое назначение для использования MPI из
<lang>.
Будут определены следующие переменные, указывающие, какие интерфейсы доступны:
-
MPI_MPICXX_FOUND -
Переменная, указывающая, есть ли MPI-2 C++ интерфейсы (введенные в 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 в четыре этапа:
- Поиск
MPIEXEC_EXECUTABLEи, если найдено, использование его базового каталога. - Проверка наличия поддержки MPI в компиляторе. Это имеет место, если пользователь передал оболочку компилятора как
CMAKE_<LANG>_COMPILERили если они используют оболочки компиляторов систем Cray. - Попытка найти оболочку компилятора MPI и определить информацию о компиляторе из неё.
- Попытка найти реализацию MPI, которая не поставляет такую оболочку, путём угадывания настроек. В настоящее время поддерживаются только Microsoft MPI и MPICH2 в Windows.
Для управления этапом MPIEXEC_EXECUTABLE можно установить следующие переменные:
-
MPIEXEC_EXECUTABLE -
Ручное указание расположения
mpiexec. -
MPI_HOME -
Указание базового каталога установки MPI.
-
ENV{MPI_HOME} -
Переменная среды для указания базового каталога установки MPI.
-
ENV{I_MPI_ROOT} -
Переменная среды для указания базового каталога установки MPI.
Для управления этапом оболочки компилятора можно установить следующие переменные:
-
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 и переходит к шагу 2.
-
MPI_SKIP_COMPILER_WRAPPER -
Если истинно, оболочка компилятора не будет искаться.
-
MPI_SKIP_GUESSING -
Если истинно, этап угадывания будет пропущен.
Кроме того, доступна следующая управляющая переменная для изменения поведения поиска:
-
MPI_CXX_SKIP_MPICXX -
Добавление определений, которые отключат MPI-2 C++ интерфейсы. В настоящее время поддерживаются 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_STRING. Эта информация обычно связана с компонентом времени выполнения реализации MPI и может отличаться в зависимости от<lang>. Обратите внимание, что возвращаемое значение полностью определено реализацией. Эта информация может использоваться для идентификации поставщика MPI и, например, для выбора правильной из нескольких сторонних библиотек, соответствующей поставщику MPI.
Обратная совместимость
Устарело начиная с версии 3.10.
Для обеспечения обратной совместимости со старыми версиями 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–2021 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.22/module/FindMPI.html