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 в три этапа:
- Проверяет, поддерживает ли компилятор 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, и переходит ко второму шагу.
-
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