共用方式為


MPI_Gatherv函式

從群組的所有成員收集變數資料到一個成員。 MPI_Gatherv函式藉由允許來自每個進程的不同資料計數,為MPI_Gather函式增加彈性。

語法

int MPIAPI MPI_Gatherv(
  _In_      void         *sendbuf,
            int          sendcount,
            MPI_Datatype sendtype,
  _Out_opt_ void         *recvbuf,
  _In_opt_  int          *recvcounts[],
  _In_opt_  int          *displs[],
            MPI_Datatype recvtype,
            int          root,
            MPI_Comm     comm
);

參數

  • sendbuf [in]
    緩衝區的控制碼,其中包含要傳送至根進程的資料。

    如果 comm 參數參考內部通訊程式,您可以在所有進程中指定 MPI_IN_PLACE 來指定就地選項。 會忽略 sendcountsendtype參數。 每個進程都會在對應的接收緩衝區元素中輸入資料。 第 n個進程會將資料傳送至接收緩衝區的第 n個元素。 根進程傳送的資料假設位於接收緩衝區的正確位置。

  • sendcount
    傳送緩衝區中的專案數目。 如果 sendcount 為零,則訊息的資料部分是空的。

  • sendtype
    緩衝區中每個專案的資料類型。

  • recvbuf [out, optional]
    根進程上緩衝區的控制碼,其中包含從每個進程接收的資料,包括根進程所傳送的資料。 此參數只有在根進程才重要。 所有非根進程都會忽略 recvbuf 參數。

  • recvcounts[] [in, optional]
    從每個進程收到的專案數目。 陣列中的每個元素都會對應至傳送程式的排名。 如果計數為零,則訊息的資料部分是空的。 此參數只有在根進程才重要。

  • displs[] [in, optional]
    相對於每個 Communicator 進程之資料的 recvbuf 參數位置。 從 process j接收的資料會放入sendbuf指標中根進程位移displs[j]元素的接收緩衝區。

    recvbufrecvcountsdispls 參數陣列中,每個陣列的第 n個元素會參考從 nth communicator 進程接收的資料。

    此參數只有在根進程才重要。

  • recvtype
    緩衝區中每個專案的資料類型。 此參數只有在根進程才重要。

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

  • 通訊
    MPI_Comm communicator 控制碼。

傳回值

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

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

Fortran

    MPI_GATHERV(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNTS, DISPLS, RECVTYPE, ROOT, COMM, IERROR)
        <type> SENDBUF(*), RECVBUF(*)
        INTEGER SENDCOUNT, SENDTYPE, RECVCOUNTS(*), DISPLS(*), RECVTYPE, ROOT, COMM, IERROR

備註

所有函式參數在根進程上都很重要,只有 sendbufsendcountsendtyperootcomm 對其他進程很重要。 comm參數在所有進程上都必須相同。

一般而言, sendtyperecvtype 參數都允許衍生資料類型。 每個進程上 sendtyperecvtype參數所指定的類型簽章必須等於根進程上 recvcount 和 sendcount參數的類型簽章。 傳送的資料量必須等於根進程與每個個別進程之間收到的資料量。 仍然允許傳送者和接收者之間的相異類型對應。

計數和類型的規格不應造成根目錄上的任何位置多次寫入。 這類呼叫錯誤。

如果 comm 參數參考內部通訊程式,則所有進程都會將其傳送緩衝區的內容傳送至根進程。 根進程會接收訊息,並以順位順序儲存這些訊息。 結果就像是群組中執行呼叫 MPI_Send(sendbuf, sendcount, sendtype, root, …) 的每個n進程,而根已執行n個對 MPI_Recv(recvbuf + i*recvcount*extent(recvtype), recvcount, recvtype, i, …) 的呼叫。 的值 extent(recvtype) 是使用 MPI_Type_get_extent 函式取得。 函式的替代描述是群組中進程所傳送的 n 個訊息會依順位順序串連,而產生的訊息會由根接收,就像 MPI_RECV(recvbuf, recvcountn, recvtype, ...) 呼叫 一樣。 所有非根進程都會忽略接收緩衝區。

如果 comm 參數參考 intercomicator,則呼叫會牽涉到 intercomicator 中的所有進程,但具有定義根進程的一個群組 A。 另一個群組 B 中的所有進程在參數中設定相同的值,也就是群組 A 中根進程的排名。根進程會在參數中設定值MPI_ROOT。 群組 A 中的所有其他進程都會在參數中設定值MPI_PROC_Null。 資料會從根進程廣播到群組 B 中的所有進程。群組 B 中進程的 緩衝區 參數必須與根進程的 buffer 參數一致。

規格需求

產品

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