FindMPI
Найти реализацию Message Passing Interface (MPI).
Message Passing Interface (MPI) — это библиотека, используемая для написания высокопроизводительных параллельных приложений с распределённой памятью, как правило, развертываемая на кластере. MPI — это стандартный интерфейс (определённый форумом MPI), для которого доступно множество реализаций.
Переменные для использования MPI
Модуль предоставляет компоненты C, CXX, MPICXX и Fortran. Каждый из них контролирует различные языки MPI, которые необходимо искать. Разница между CXX и MPICXX в том, что CXX указывает на возможность использования MPI C API из C++, а MPICXX — на MPI-2 C++ API, который был снова удалён в 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 -
Переменная, указывающая на наличие 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 -
Список каталогов включений, которые будут добавлены к местам включения
<lang>.
Переменная MPI_<lang>_LIBRARIES будет собрана из следующих переменных:
-
MPI_<lib_name>_LIBRARY -
Расположение библиотеки с именем
<lib_name>для использования с MPI. -
MPI_<lang>_LIB_NAMES -
Список каталогов включений, которые будут добавлены к местам включения
<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.
Обратная совместимость
Для обеспечения обратной совместимости со старыми версиями 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–2020 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.16/module/FindMPI.html