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