Spec-Zone.ru › CMake 3.21

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 в четыре этапа:

  1. Поиск MPIEXEC_EXECUTABLE и, если найдено, использование его базового каталога.
  2. Проверка наличия поддержки MPI в компиляторе. Это происходит, если пользователь передал оболочку компилятора как CMAKE_<LANG>_COMPILER или если он находится на системе Cray.
  3. Попытка найти оболочку компилятора MPI и определение информации о компиляторе из неё.
  4. Попытка найти реализацию 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–2021 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.21/module/FindMPI.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API