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–2022 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.23/module/FindMPI.html