Freigeben über


MPI_Alltoallv-Funktion

Sammelt Daten aus und verteilt Daten an alle Mitglieder einer Gruppe. Die MPI_Alltoallv-Funktion erhöht die Flexibilität der MPI_Alltoall-Funktion , da sie eine unterschiedliche Anzahl von Daten aus jedem Prozess zulässt.

Syntax

int MPIAPI MPI_Alltoallv(
  _In_  void         *sendbuf,
  _In_  int          *sendcounts,
  _In_  int          *sdispls,
        MPI_Datatype sendtype,
  _Out_ void         *recvbuf,
  _In_  int          *recvcounts,
  _In_  int          *rdispls,
        MPI_Datatype recvtype,
        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 Intrakommunikationsgeber 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 erfasst Daten im entsprechenden Empfangspufferelement.

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

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

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

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

  • sendtype
    Der MPI-Datentyp der Elemente im Sendepuffer.

  • recvbuf [out]
    Der Zeiger auf einen Puffer, der die Daten enthält, die von den einzelnen Prozessen 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 den einzelnen Communicatorprozessen im Empfangspuffer.

  • rdispls [in]
    Der Speicherort relativ zum recvbuf-Parameter der Daten aus jedem Kommunikatorprozess.

    In den parameterarrays recvbuf, recvcounts und rdispls verweist das nth-Element jedes Arrays auf die Daten, die vom n thcommunicator-Prozess empfangen werden.

  • recvtype
    Der MPI-Datentyp jedes Elements im Puffer.

  • comm
    Gibt das MPI_Comm Communicatorhandle an.

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_ALLTOALL(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT, RECVTYPE,
                COMM, IERROR)
        <type> SENDBUF(*), R.ECVBUF(*)
        INTEGER SENDCOUNT, SENDTYPE, RECVCOUNT, RECVTYPE, COMM, IERROR

Hinweise

Die vom sendcount angegebene Typsignatur und sendtype-Parameter für einen Prozess müssen gleich der Typsignatur sein, die durch den recvcount-Parameter und recvtype-Parameter des empfangenden Prozesses angegeben wird. Daher muss die Menge der gesendeten Daten der Datenmenge entsprechen, die zwischen einem beliebigen Prozesspaar empfangen wird. Unterschiedliche Typzuordnungen zwischen Absender und Empfänger sind weiterhin zulässig.

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 von Prozess i gesendet wird, von Prozess j empfangen und im ith-Block des Empfangspuffers platziert. Diese Blöcke müssen nicht alle die gleiche Größe aufweisen.

Das Ergebnis des Aufrufs der MPI_Alltoallv-Funktion ist, als habe jeder Prozess eine Nachricht an jeden anderen Prozess mit MPI_Send(sendbuf + sdispls[i]*extent(sendtype), sendcounts[i], sendtype, I, …)gesendet und eine Nachricht von jedem anderen Prozess mit einem Aufruf von MPI_Recv(recvbuf + rdispls[i]*extent(recvtype), recvcounts[i], recvtype, I, …)empfangen.

Wenn Sie die direkte Option angeben, wird angegeben, dass die gleiche Menge und dieselbe Art von Daten zwischen zwei beliebigen Prozessen in der Gruppe des Kommunikators gesendet und empfangen werden. Unterschiedliche 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. Dieser symmetrische Austausch kann in Anwendungen nützlich sein, in denen die zu sendenden Daten nach dem MPI_Alltoallv Funktionsaufruf nicht vom Sendeprozess verwendet werden.

Wenn der comm-Parameter auf einen Interkommunikationsator verweist, dann ist das Ergebnis so, als sendet jeder Prozess in Gruppe A eine Nachricht an jeden Prozess in Gruppe B und umgekehrt. Der j-teSendepuffer des Prozesses i in Gruppe A sollte mit dem i. 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-Kollektivfunktionen

MPI_Datatype

MPI_Alltoall

MPI_Gather

MPI_Scatter

MPI_Send

MPI_Recv