Spec-Zone.ru › CMake 3.10

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>, указанные в формате ;-list.
MPI_<lang>_COMPILE_DEFINITIONS
Определения компиляции для программ MPI в <lang>, указанные в формате ;-list.
MPI_<lang>_INCLUDE_DIRS
Путь(и) к заголовочному файлу MPI.
MPI_<lang>_LINK_FLAGS
Флаги компоновщика для программ MPI.
MPI_<lang>_LIBRARIES
Все библиотеки, с которыми необходимо связать программы MPI.

Кроме того, определяются следующие IMPORTED целевые объекты:

MPI::MPI_<lang>
Целевой объект для использования MPI из <lang>.

Будут определены следующие переменные, указывающие на наличие определённых библиотек:

MPI_MPICXX_FOUND
Переменная, указывающая, присутствуют ли C++-связующие MPI-2 (введены в 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. Проверяет, поддерживает ли компилятор MPI встроенно. Это так, если пользователь передал оболочку компилятора как CMAKE_<LANG>_COMPILER или если он находится на системе Cray.
  2. Попытка найти оболочку компилятора MPI и определение информации о компиляторе из неё.
  3. Попытка найти реализацию 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, и переходит ко второму шагу.
MPI_SKIP_COMPILER_WRAPPER
Если истинно, оболочка компилятора MPI не будет искаться.
MPI_SKIP_GUESSING
Если истинно, этап угадывания будет пропущен.

Кроме того, доступна следующая управляющая переменная для изменения поведения поиска:

MPI_CXX_SKIP_MPICXX
Добавляет некоторые определения, которые отключат C++-связующие MPI-2. В настоящее время поддерживаются 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. Эта информация обычно связана с компонентом времени выполнения реализации 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–2019 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.10/module/FindMPI.html

Spec-Zone.ru

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