FindMPI

尋找訊息傳遞介面 (MPI) 實作。

訊息傳遞介面 (MPI) 是一個用於編寫高效能分散式記憶體平行應用程式的函式庫,通常部署在叢集上。MPI 是一個標準介面 (由 MPI 論壇定義),有許多可用的實作。

版本 3.10 新增:模組的大幅改進:許多新變數、每個語言的組件、更廣泛的執行時期支援。

使用 MPI 的變數

此模組公開了組件 CCXXMPICXXFortran。 這些組件各自控制要搜尋的各種 MPI 語言。 CXXMPICXX 之間的區別在於,CXX 指的是可從 C++ 使用的 MPI C API,而 MPICXX 指的是在 MPI-3 中再次移除的 MPI-2 C++ API。

根據啟用的組件,將設定以下變數

MPI_FOUND

變數,指示已找到所有請求語言的 MPI 設定。如果未指定任何組件,則如果偵測到所有已啟用語言的 MPI 設定,則此值為 true。請注意,MPICXX 組件不會影響此變數。

MPI_VERSION

在請求的語言中偵測到的 MPI 最低版本,如果未指定任何組件,則為所有已啟用語言的 MPI 最低版本。

此模組將在您的專案中為每種語言設定以下變數,其中 <lang> 是 C、CXX 或 Fortran 之一

MPI_<lang>_FOUND

變數,指示已找到 <lang> 的 MPI 設定,且簡單的 MPI 測試程式可以使用提供的設定進行編譯。

MPI_<lang>_COMPILER

如果存在,則為 <lang> 的 MPI 編譯器。

MPI_<lang>_COMPILE_OPTIONS

;-清單 形式給出的 <lang> 中 MPI 程式的編譯選項。

MPI_<lang>_COMPILE_DEFINITIONS

;-清單 形式給出的 <lang> 中 MPI 程式的編譯定義。

MPI_<lang>_INCLUDE_DIRS

MPI 標頭的包含路徑。

MPI_<lang>_LINK_FLAGS

MPI 程式的連結器旗標。

MPI_<lang>_LIBRARIES

要連結 MPI 程式的所有函式庫。

版本 3.9 新增:此外,還定義了以下 IMPORTED 目標

MPI::MPI_<lang>

<lang> 使用 MPI 的目標。

將定義以下指示哪些綁定存在的變數

MPI_MPICXX_FOUND

變數,指示 MPI-2 C++ 綁定是否存在 (在 MPI-2 中引入,在 MPI-3 中移除)。

MPI_Fortran_HAVE_F77_HEADER

如果 Fortran 77 標頭 mpif.h 可用,則為 True。

MPI_Fortran_HAVE_F90_MODULE

如果 Fortran 90 模組 mpi 可用於存取 MPI (僅限 MPI-2 及更高版本),則為 True。

MPI_Fortran_HAVE_F08_MODULE

如果 Fortran 2008 mpi_f08 可用於 MPI 程式 (僅限 MPI-3 及更高版本),則為 True。

如果可能,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 版本。

請注意,沒有變數指示是否可透過 mpi.h 存取 C 綁定,因為 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 實作,方法是猜測設定。目前,僅支援 Windows 上的 Microsoft MPI 和 MPICH2。

為了控制 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

有效值為 MSMPIMPICH2。如果設定,則僅搜尋給定的函式庫。預設情況下,如果 MSMPIMPICH2 都可用,則優先選擇 MSMPI。這也會將 MPI_SKIP_COMPILER_WRAPPER 設定為 true,這可能會被覆寫。

可以使用以下控制變數跳過每個搜尋步驟

MPI_ASSUME_NO_BUILTIN_MPI

如果為 true,則模組假設編譯器本身不提供 MPI 實作,並跳至步驟 2。

MPI_SKIP_COMPILER_WRAPPER

如果為 true,則不會搜尋編譯器包裝器。

MPI_SKIP_GUESSING

如果為 true,則將跳過猜測步驟。

此外,以下控制變數可用於變更搜尋行為

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

mpimpi_f08 模組的位置 (如果可用)。

對於所有語言,還會考慮以下變數

MPI_<lang>_ADDITIONAL_INCLUDE_DIRS

除了正常包含目錄之外,還需要的路徑的 ;-清單

MPI_<include_name>_INCLUDE_DIR

<include_name> 引用的包含資料夾的路徑變數。

MPI_<lang>_ADDITIONAL_INCLUDE_VARS

將新增至 <lang> 的包含位置的 <include_name>;-清單

變數 MPI_<lang>_LIBRARIES 將由以下變數組裝而成

MPI_<lib_name>_LIBRARY

名為 <lib_name> 的函式庫的位置,用於 MPI。

MPI_<lang>_LIB_NAMES

將新增至 <lang> 的包含位置的 <lib_name>;-清單

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_SUPPORTEDMPI_ASYNC_PROTECTS_NONBLOCKING 的值,並使其值以 MPI_Fortran_<binding>_SUBARRAYSMPI_Fortran_<binding>_ASYNCPROT 的形式提供,其中 <binding>F77_HEADERF90_MODULEF08_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_OPTIONSMPI_<lang>_COMPILE_DEFINITIONS

MPI_<lang>_INCLUDE_PATH

對於使用,請使用 MPI_<lang>_INCLUDE_DIRS,對於指定資料夾,請改用 MPI_<lang>_ADDITIONAL_INCLUDE_DIRS

MPIEXEC

請改用 MPIEXEC_EXECUTABLE