共用方式為


MPI_Alltoallw 函式

從群組的所有成員收集數據並散佈數據。 MPI_Alltoallw函式是此 API 中最一般的完整數據交換形式。 MPI_Alltoallw 啟用計數、位移和數據類型的個別規格。

語法

int MPIAPI MPI_Alltoallw(
  _In_  void         *sendbuf,
  _In_  int          *sendcounts[],
  _In_  int          *sdispls[],
  _In_  MPI_Datatype sendtypes[],
  _Out_ void         *recvbuf,
  _In_  int          *recvcounts[],
  _In_  int          *rdispls[],
  _In_  MPI_Datatype recvtypes[],
        MPI_Comm     comm
);

參數

  • sendbuf [in]
    要傳送至群組中所有進程之數據的指標。 緩衝區中元素的數目和數據類型是在 sendcountsendtype 參數中指定。 緩衝區中的每個項目都會對應至群組中的進程。

    如果 comm 參數參考內部通訊程式,您可以在所有進程中指定 MPI_IN_PLACE 來指定就地選項。 會忽略 sendcountsdisplssendtype 參數。 每個進程都會在對應的接收緩衝區元素中輸入數據。

    傳送和接收的數據必須具有相同的類型對應,如 recvcounts 陣列和 recvtype 參數所指定,而且會從 rdispls 參數所指定的接收緩衝區位置讀取。

  • sendcounts [in]
    這個進程在緩衝區中傳送的數據元素數目,如 sendbuf 參數中所指定。 如果 sendcount 中的專案為零,則來自該程式之訊息的數據部分是空的。

  • sdispls [in]
    每個 Communicator 進程之數據的 sendbuf 參數相對位置,以位元組為單位。

    Entry j 會指定相對於 sendbuf 參數的位移,從中取得以進程 j 為目標的傳出數據。

  • sendtypes [in]
    傳送緩衝區中每個專案的數據類型。 Entry j 會指定傳送至群組中處理 j 的數據類型。

  • recvbuf [out]
    緩衝區的指標,其中包含從每個進程接收的數據。 緩衝區中元素的數目和數據類型是在 recvcountrecvtype 參數中指定。

  • recvcounts [in]
    接收緩衝區中每個 Communicator 進程的數據元素數目。

  • rdispls [in]
    相對於每個 Communicator 進程之數據的 recvbuf 參數,以位元組為單位的位置。 Entry i 會指定相對於 recvbuf 參數的位移,從進程 i 放置傳入數據的位置。

    recvbufrecvcountsrdispls 參數陣列中,每個數位的第 n個元素會參考從 nth communicator 進程接收的數據。

  • recvtypes [in]
    緩衝區中每個項目的數據類型。 Entry i 會指定從進程 i 接收的數據類型。

  • 通訊
    MPI_Comm communicator 句柄。

傳回值

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

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

Fortran

    MPI_ALLTOALLW(SENDBUF, SENDCOUNT, SDISPLS, SENDTYPE, RECVBUF, RECVCOUNTS, RDISPLS, RECVTYPE,COMM, IERROR)
        <type> SENDBUF(*), R.ECVBUF(*)
        INTEGER SENDCOUNT, SENDTYPES(*), SDISPLS(*), RECVCOUNTS(*), RDISPLS(*), RECVTYPE, COMM, IERROR

備註

重要

為了允許最大的彈性,傳送和接收緩衝區內的區塊位移會以位元組為單位指定。 

所有進程的所有參數都很重要。 所有進程的 comm 參數都必須相同。

如果 comm 參數參考內部通訊程式,則會由進程 j 接收從進程 i 傳送的 j區塊,並放在接收緩衝區的 i 區塊中。 這些區塊不需要具有相同的大小。

process isendcounts[j]sendtypes[j] 參數所指定的類型簽章必須等於與 process j] 和 recvtypes[i] 相關聯的類型簽章。 因此,傳送的數據量必須等於任何一對進程之間收到的數據量。 仍然允許傳送者和接收者之間的相異類型對應。

呼叫 MPI_Alltoallw 函式的結果,就像每個進程使用 MPI_Send(sendbuf+sdispls[i],sendcounts[i],sendtypes[i] ,i,...)將訊息傳送給其他每個進程,並收到來自其他每個進程的訊息,並 MPI_Recv(recvbuf+rdispls[i],recvcounts[i],recvtypes[i] ,i,...)呼叫 。

指定就地選項表示在通訊器群組中的任何兩個進程之間傳送和接收相同的數據量和類型。 不同的進程配對可以交換不同的數據量。 用戶必須確定處理程式 i 上的 recvcounts[j]recvtype 符合 process j 上的 recvcounts[i]recvtype

如果 comm 參數參考通訊器,則結果會如同群組 A 中的每個進程將訊息傳送至群組 B 中的每個進程,反之亦然。 群組 A 中進程 i 的第 j個傳送緩衝區應該與群組 B 中進程 j 的接收緩衝區一致,反之亦然。

規格需求

產品

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_Alltoallv

MPI_Gather

MPI_Scatter

MPI_Send

MPI_Recv