Freigeben über


MPI_Alltoallw-Funktion

Sammelt Daten aus und verteilt Daten an alle Mitglieder einer Gruppe. Die MPI_Alltoallw-Funktion ist die allgemeinste Form des vollständigen Datenaustauschs in dieser API. MPI_Alltoallw ermöglicht eine separate Spezifikation von Anzahl, Verschiebung und Datentyp.

Syntax

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
);

Parameter

  • sendbuf [in]
    Der Zeiger auf die Daten, die an alle Prozesse in der Gruppe gesendet werden sollen. Die Anzahl und der Datentyp der Elemente im Puffer werden in den Parametern sendcount und sendtype angegeben. Jedes Element im Puffer entspricht einem Prozess in der Gruppe.

    Wenn der comm-Parameter auf einen Intrakommunikations-Parameter verweist, können Sie eine direkte Option angeben, indem Sie in allen Prozessen MPI_IN_PLACE angeben. Die Parameter sendcount, sdispls und sendtype werden ignoriert. Jeder Prozess gibt Daten in das entsprechende Empfangspufferelement ein.

    Daten, die gesendet und empfangen werden, müssen dieselbe Typzuordnung aufweisen, wie durch das recvcounts-Array und den recvtype-Parameter angegeben, und werden aus den Speicherorten des Empfangspuffers gelesen, wie durch den rdispls-Parameter angegeben.

  • sendcounts [in]
    Die Anzahl der Datenelemente, die dieser Prozess im Puffer sendet, wie im sendbuf-Parameter angegeben. Wenn ein Element in sendcount null ist, ist der Datenteil der Nachricht aus diesem Prozess leer.

  • sdispls [in]
    Der Speicherort der Daten für jeden Communicatorprozess relativ zum sendbuf-Parameter in Byte.

    Eintrag j gibt die Verschiebung relativ zum sendbuf-Parameter an, aus dem die ausgehenden Daten abgerufen werden sollen, die für den Prozess j bestimmt sind.

  • sendtypes [in]
    Der Datentyp für jedes Element im Sendepuffer. Eintrag j gibt den Typ der Daten an, die zum Verarbeiten von j in der Gruppe gesendet werden.

  • recvbuf [out]
    Der Zeiger auf einen Puffer, der die Daten enthält, die von jedem Prozess empfangen werden. Die Anzahl und der Datentyp der Elemente im Puffer werden in den Parametern recvcount und recvtype angegeben.

  • recvcounts [in]
    Die Anzahl der Datenelemente aus jedem Communicatorprozess im Empfangspuffer.

  • rdispls [in]
    Der Speicherort der Daten aus den einzelnen Communicatorprozessen relativ zum recvbuf-Parameter in Byte. Eintrag i gibt die Verschiebung relativ zum recvbuf-Parameter an, an dem die eingehenden Daten aus Prozess i platziert werden sollen.

    In den Parameterarrays recvbuf, recvcounts und rdispls bezieht sich das nth-Element jedes Arrays auf die Daten, die vom n-tenCommunicator-Prozess empfangen werden.

  • recvtypes [in]
    Der Datentyp jedes Elements im Puffer. Eintrag i gibt den Typ der Daten an, die von Prozess i empfangen werden.

  • comm
    Das MPI_Comm Communicatorhandle.

Rückgabewert

Gibt MPI_SUCCESS nach Erfolg zurück. Andernfalls ist der Rückgabewert ein Fehlercode.

In Fortran wird der Rückgabewert im IERROR-Parameter gespeichert.

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

Hinweise

Wichtig

Um maximale Flexibilität zu ermöglichen, wird die Verschiebung von Blöcken innerhalb der Sende- und Empfangspuffer in Bytes angegeben. 

Alle Parameter sind für alle Prozesse von Bedeutung. Der comm-Parameter muss für alle Prozesse identisch sein.

Wenn der comm-Parameter auf einen Intracommunicator verweist, wird der jth-Block, der vom Prozess i gesendet wird, von Prozess j empfangen und im i-tenBlock des Empfangspuffers platziert. Diese Blöcke müssen nicht alle die gleiche Größe haben.

Die Typsignatur, die von den Parametern sendcounts[j] und sendtypes[j] für process i angegeben wird, muss gleich der Typsignatur sein, die recvcounts[i] und recvtypes[i] bei Prozess j zugeordnet ist. Daher muss die gesendete Datenmenge gleich der Datenmenge sein, die zwischen einem beliebigen Prozesspaar empfangen wird. Unterschiedliche Typzuordnungen zwischen Sender und Empfänger sind weiterhin zulässig.

Das Ergebnis eines Aufrufs der MPI_Alltoallw-Funktion ist, als ob jeder Prozess mit MPI_Send(sendbuf+sdispls[i],sendcounts[i],sendtypes[i] ,i,...)eine Nachricht an jeden anderen Prozess gesendet und eine Nachricht von jedem anderen Prozess mit einem Aufruf MPI_Recv(recvbuf+rdispls[i],recvcounts[i],recvtypes[i] ,i,...)von empfangen würde.

Wenn Sie die direkte Option angeben, wird angegeben, dass die gleiche Menge und art der Daten zwischen zwei beliebigen Prozessen in der Gruppe des Communicators gesendet und empfangen werden. Verschiedene Prozesspaare können unterschiedliche Datenmengen austauschen. Benutzer müssen sicherstellen, dass recvcounts[j] und recvtype on process irecvcounts[i] und recvtype on process j übereinstimmen.

Wenn der comm-Parameter auf einen Intercommunicator verweist, ist das Ergebnis, als ob jeder Prozess in Gruppe A eine Nachricht an jeden Prozess in Gruppe B sendet und umgekehrt. Der j-teSendepuffer von Prozess i in Gruppe A sollte mit dem ith-Empfangspuffer des Prozesses j in Gruppe B konsistent sein und umgekehrt.

Anforderungen

Produkt

HPC Pack 2012 MS-MPI Redistributable Package, HPC Pack 2008 R2 MS-MPI Redistributable Package, HPC Pack 2008 MS-MPI Redistributable Package oder HPC Pack 2008 Client Utilities

Header

Mpi.h; Mpif.h

Bibliothek

Msmpi.lib

DLL

Msmpi.dll

Weitere Informationen

MPI-Kollektive Funktionen

MPI_Datatype

MPI_Alltoallv

MPI_Gather

MPI_Scatter

MPI_Send

MPI_Recv