Freigeben über


MPI_Gatherv-Funktion

Sammelt Variablendaten von allen Mitgliedern einer Gruppe zu einem Element. Die MPI_Gatherv-Funktion erhöht die Flexibilität der MPI_Gather-Funktion , da sie eine unterschiedliche Anzahl von Daten aus den einzelnen Prozessen zulässt.

Syntax

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

Parameter

  • sendbuf [in]
    Das Handle an einen Puffer, der die Daten enthält, die an den Stammprozess gesendet werden sollen.

    Wenn der comm-Parameter auf einen Intracommunicator verweist, können Sie eine direkte Option angeben, indem Sie in allen Prozessen MPI_IN_PLACE angeben. Die Parameter sendcount und sendtype werden ignoriert. Jeder Prozess erfasst Daten im entsprechenden Empfangspufferelement. Der nth-Prozess sendet Daten an das nth-Element des Empfangspuffers. Es wird davon ausgegangen, dass sich die vom Stammprozess gesendeten Daten an der richtigen Stelle im Empfangspuffer befinden.

  • sendcount
    Die Anzahl der Elemente im Sendepuffer. Wenn sendcount 0 ist, ist der Datenteil der Nachricht leer.

  • sendtype
    Der Datentyp jedes Elements im Puffer.

  • recvbuf [out, optional]
    Das Handle für einen Puffer im Stammprozess, der die Daten enthält, die von jedem Prozess empfangen werden, einschließlich der Daten, die vom Stammprozess gesendet werden. Dieser Parameter ist nur beim Stammprozess von Bedeutung. Der recvbuf-Parameter wird für alle Nicht-Stammprozesse ignoriert.

  • recvcounts[] [in, optional]
    Die Anzahl der Elemente, die von den einzelnen Prozessen empfangen werden. Jedes Element im Array entspricht dem Rang des sendenden Prozesses. Wenn die Anzahl 0 ist, ist der Datenteil der Nachricht leer. Dieser Parameter ist nur beim Stammprozess von Bedeutung.

  • displs[] [in, optional]
    Der Speicherort relativ zum recvbuf-Parameter der Daten aus jedem Kommunikatorprozess. Die vom Prozess j empfangenen Daten werden vom Sendbuf-Zeiger in den Empfangspuffer der Elemente des Stammprozessoffsets[j] platziert.

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

    Dieser Parameter ist nur beim Stammprozess von Bedeutung.

  • recvtype
    Der Datentyp jedes Elements im Puffer. Dieser Parameter ist nur beim Stammprozess von Bedeutung.

  • root
    Der Rang des empfangenden Prozesses innerhalb des angegebenen Kommunikators.

  • 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_GATHERV(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNTS, DISPLS, RECVTYPE, ROOT, COMM, IERROR)
        <type> SENDBUF(*), RECVBUF(*)
        INTEGER SENDCOUNT, SENDTYPE, RECVCOUNTS(*), DISPLS(*), RECVTYPE, ROOT, COMM, IERROR

Hinweise

Alle Funktionsparameter sind für den Stammprozess von Bedeutung, nur sendbuf, sendcount, sendtype, root und comm sind für die anderen Prozesse von Bedeutung. Die Root- und comm-Parameter müssen für alle Prozesse identisch sein.

Im Allgemeinen sind abgeleitete Datentypen sowohl für die Parameter sendtype als auch recvtype zulässig. Die Typsignatur, wie sie durch die Parameter sendtype und recvtype für jeden Prozess angegeben wird, muss gleich der Typsignatur des recvcount - und sendcount-Parameters im Stammprozess sein. Die Menge der gesendeten Daten muss der Datenmenge entsprechen, die zwischen dem Stammprozess und jedem einzelnen Prozess empfangen wird. Unterschiedliche Typzuordnungen zwischen Absender und Empfänger sind weiterhin zulässig.

Die Angabe von Anzahlen und Typen sollte nicht dazu führen, dass ein Speicherort im Stamm mehrmals geschrieben wird. Ein solcher Aufruf ist falsch.

Wenn der comm-Parameter auf einen Intracommunicator verweist, senden alle Prozesse den Inhalt des Sendepuffers an den Stammprozess. Der Stammprozess empfängt die Nachrichten und speichert sie in Rangfolge. Das Ergebnis ist, als ob jeder der n-Prozesse in der Gruppe, die ausgeführt werden, einen Aufruf von MPI_Send(sendbuf, sendcount, sendtype, root, …)ausgeführt hat, und der Stamm n Aufrufe von MPI_Recv(recvbuf + i*recvcount*extent(recvtype), recvcount, recvtype, i, …)ausgeführt hat. Der Wert von extent(recvtype) wird mithilfe der funktion MPI_Type_get_extent abgerufen. Eine alternative Beschreibung der Funktion besteht darin, dass die n-Nachrichten , die von den Prozessen in der Gruppe gesendet werden, in Rangfolge verkettet werden, und die resultierende Nachricht vom Stamm empfangen wird, als ob von einem Aufruf MPI_RECV(recvbuf, recvcountn, recvtype, ...)von empfangen wird. Der Empfangspuffer wird für alle Nicht-Stammprozesse ignoriert.

Wenn der comm-Parameter auf einen Intercommunicator verweist, umfasst der Aufruf alle Prozesse im Intercommunicator, aber mit einer Gruppe, Gruppe A, die den Stammprozess definiert. Alle Prozesse in der anderen Gruppe, Gruppe B, legen denselben Wert im Stammparameter fest, d. h. den Rang des Stammprozesses in Gruppe A. Der Stammprozess legt den Wert MPI_ROOT im Stammparameter fest. Alle anderen Prozesse in Gruppe A legen den Wert MPI_PROC_NULL im Stammparameter fest. Daten werden aus dem Stammprozess an alle Prozesse in Gruppe B übertragen. Die Pufferparameter der Prozesse in Gruppe B müssen mit dem Pufferparameter des Stammprozesses konsistent sein.

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_Gather