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 может вызвать дополнительные проблемы, такие как уведомление о брандмауэре на некоторых системах. Вы должны включать эти проверки только в том случае, если вам абсолютно необходима эта информация.
Если следующие переменные установлены в значение true, будет выполнено соответствующее поиск:
-
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.21/module/FindMPI.html