共用方式為


MPI_Reduce函式

跨群組的所有成員執行全域縮減作業。 您可以指定預先定義的數學或邏輯運算或應用程式定義的作業。

語法

int MPIAPI MPI_Reduce(
  _In_      void         *sendbuf,
  _Out_opt_ void         *recvbuf,
            int          count,
            MPI_Datatype datatype,
            MPI_Op       op,
            int          root,
            MPI_Comm     comm
);

參數

  • sendbuf [in]
    緩衝區的句柄,其中包含要傳送至根進程的數據。

    如果 comm 參數參考內部通訊程式,您可以在所有進程中指定 MPI_IN_PLACE 來指定就地選項。 會忽略 sendcountsendtype 參數。 每個進程都會在對應的接收緩衝區元素中輸入數據。 第 n個進程會將數據傳送至接收緩衝區的第 n個元素。 根進程會從接收緩衝區的對應元素取得其輸入數據,並將它取代為輸出數據。

  • recvbuf [out, optional]
    要接收縮減作業結果之緩衝區的句柄。 此參數只有在根進程才重要。

  • 計數
    要從這個進程傳送的項目數目。

  • datatype
    緩衝區中每個項目的數據類型。 此參數必須與 op 參數中指定的作業相容。

  • op
    要執行的全域縮減作業。 句柄可以指出內建或應用程式定義的作業。 如需預先定義的作業清單,請參閱 MPI_Op 主題。

  • root
    指定通訊器內接收進程的排名。

  • 通訊
    MPI_Comm communicator 句柄。

傳回值

傳回成功時 MPI_SUCCESS 。 否則,傳回值是錯誤碼。

在 Fortran 中,傳回值會儲存在 IERROR 參數中。

Fortran

    MPI_REDUCE(SENDBUF, RECVBUF, COUNT, DATATYPE, OP, ROOT, COMM, IERROR) 
        <type> SENDBUF(*), RECVBUF(*) 
        INTEGER COUNT, DATATYPE, OP, ROOT, COMM, IERROR

備註

MPI_Reduce函式會實作,並假設指定的作業具有關聯性。 所有預先定義的作業都是設計成關聯和通通。 用戶可以定義設計為關聯的作業,但無法進行通通。 縮減作業的預設評估順序取決於群組中進程的排名。 不過,實作可以利用關聯性,或關聯性和通通性來變更評估順序。 此程式可能會變更不嚴格關聯和交換作業的縮減結果,例如浮點加法。

某些應用程式無法忽略浮點運算的非關聯本質,或使用需要特殊評估順序的使用者定義作業,而且無法視為關聯。 在此情況下,您可以明確強制執行評估的順序。 例如,在需要嚴格由左至右或由右至左評估順序的作業中,您可以使用下列程式:

  1. 例如,使用 MPI_Gather 函式,在單一進程中收集所有操作數。
  2. 例如,使用 MPI_Reduce_local 函式,以必要的順序套用縮減作業。
  3. 如有需要,請將結果廣播或散佈至其他進程。

注意

可以將不同的使用者定義作業提供給每個進程中 的 MPI_Reduce 函式。 函式不會定義在此案例中使用哪些操作數的作業。 您無法假設如何實作 MPI_Reduce 函式。 在每一個進程中指定相同的作業是最安全的。

 

用戶定義運算子可以在一般衍生數據類型上運作。 在此情況下,將縮減作業套用的每個自變數都是這類數據類型所描述的一個專案,其中包含數個基本值。

傳送緩衝區中允許重疊的數據類型,但在接收緩衝區中則不允許。 接收緩衝區中的重疊數據類型可能會產生無法預期的結果,並視為錯誤。

如果 comm 參數參考內部通訊程式, MPI_Reduce 函式會結合群組中每個進程的輸入緩衝區中指定的專案,並使用指定的作業,傳回根進程的輸出緩衝區中的合併值。

輸入緩衝區和輸出緩衝區具有相同數據類型的相同項目數目。 針對 countdatatypeoprootcomm 參數使用相同的值,呼叫所有群組成員中的函式。 此做法可確保所有進程都提供相同長度的輸入緩衝區和輸出緩衝區,以及相同類型的元素。

每個進程都可以提供一個專案或元素序列,在此情況下,作業會在序列的每個項目上執行。 例如,如果作業 MPI_MAX ,而傳送緩衝區包含兩個浮點數的專案,則 recvbuf(1) 會收到的 (sendbuf(1)) 全域最大值,並 recvbuf(2) 接收的 (sendbuf(2))全域最大值。

如果 comm 參數參考 intercomicator,則呼叫會牽涉到 intercomicator 中的所有進程,但具有定義根進程的一個群組 A。 另一個群組 B 中的所有進程在參數中設定相同的值,也就是群組 A 中根進程的排名。根進程會在參數中設定值MPI_ROOT。 群組 A 中的所有其他進程都會在參數中設定值MPI_PROC_NULL。 只有傳送緩衝區參數在群組 B 進程中很重要,而且只有接收緩衝區參數在根進程中很重要。

規格需求

產品

HPC Pack 2012 MS-MPI 可轉散發套件、HPC Pack 2008 R2 MS-MPI 可轉散發套件、HPC Pack 2008 MS-MPI 可轉散發套件或 HPC Pack 2008 用戶端公用程式

標頭

Mpi.h;Mpif.h

媒體櫃

Msmpi.lib

DLL

Msmpi.dll

另請參閱

MPI 共同函式

MPI_Datatype

MPI_Gather

MPI_Op

MPI_Bcast