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++ bindings (введены в 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 bindings, доступных через mpi.h, так как стандарты MPI всегда требовали, чтобы этот binding работал как в коде 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++ bindings. В настоящее время поддерживаются 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.
Обратная совместимость
Для обеспечения обратной совместимости со старыми версиями 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.17/module/FindMPI.html