FindMPI
Поиск реализации Message Passing Interface (MPI).
Message Passing Interface (MPI) — это библиотека, используемая для написания высокопроизводительных распределённых параллельных приложений, обычно развёртываемых на кластере. MPI — это стандартный интерфейс (определённый форумом MPI), для которого доступно множество реализаций.
Переменные для использования 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.
Кроме того, определены следующие цели 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 в три этапа:
- Проверка наличия поддержки MPI в компиляторе. Это имеет место, если пользователь передал обёртку компилятора как
CMAKE_<LANG>_COMPILERили если он находится на системе Cray. - Попытка найти обёртку компилятора MPI и определить информацию о компиляторе из неё.
- Попытка найти реализацию MPI, которая не поставляет такую обёртку, путём предположения настроек. В настоящее время поддерживаются только Microsoft MPI и MPICH2 в Windows.
Для управления вторым этапом можно задать следующие переменные:
-
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. Эта информация обычно связана с компонентом времени выполнения реализации 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.14/module/FindMPI.html