Dela via


funktionen MPI_Gatherv

Samlar in variabeldata från alla medlemmar i en grupp till en medlem. Funktionen MPI_Gatherv ger flexibilitet till funktionen MPI_Gather genom att tillåta ett varierande antal data från varje process.

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

Parametrar

  • sendbuf [in]
    Handtaget till en buffert som innehåller de data som ska skickas till rotprocessen.

    Om comm-parametern refererar till en intracommunicator kan du ange ett alternativ på plats genom att ange MPI_IN_PLACE i alla processer. Parametrarna sendcount och sendtype ignoreras. Varje process anger data i motsvarande mottagningsbuffertelement. Den n:e processen skickar data till det n:e elementet i mottagningsbufferten. De data som skickas av rotprocessen antas vara på rätt plats i mottagningsbufferten.

  • sendcount
    Antalet element i sändningsbufferten. Om sendcount är noll är datadelen av meddelandet tom.

  • sendtype
    Datatypen för varje element i bufferten.

  • recvbuf [ut, valfritt]
    Handtaget till en buffert i rotprocessen som innehåller de data som tas emot från varje process, inklusive data som skickas av rotprocessen. Den här parametern är bara viktig i rotprocessen. Recvbuf-parametern ignoreras för alla icke-rotprocesser.

  • recvcounts[] [in, optional]
    Antalet element som tas emot från varje process. Varje element i matrisen motsvarar rangordningen för sändningsprocessen. Om antalet är noll är datadelen av meddelandet tom. Den här parametern är bara viktig i rotprocessen.

  • displs[] [in, optional]
    Platsen, i förhållande till parametern recvbuf , för data från varje kommunikationsprocess. De data som tas emot från process j placeras i mottagarbufferten för rotprocessförskjutningens displs[j] element från sendbuf-pekaren .

    I matriserna recvbuf, recvcounts och displs refererar det n:e elementet i varje matris till de data som tas emot från den n:e kommunikatorprocessen.

    Den här parametern är bara viktig i rotprocessen.

  • recvtype
    Datatypen för varje element i bufferten. Den här parametern är bara viktig i rotprocessen.

  • Root
    Rangordningen för den mottagande processen inom den angivna kommunikatören.

  • Comm
    Den MPI_Comm kommunikationshandtaget.

Returvärde

Returnerar MPI_SUCCESS vid lyckat resultat. Annars är returvärdet en felkod.

I Fortran lagras returvärdet i parametern 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

Kommentarer

Alla funktionsparametrar är viktiga för rotprocessen, endast sendbuf, sendcount, sendtype, root och comm är viktiga för de andra processerna. Rot- och kommaparametrarna måste vara identiska i alla processer.

I allmänhet tillåts härledda datatyper för både parametrarna sendtype och recvtype . Typsignaturen som anges av parametrarna sendtype och recvtype i varje process måste vara lika med typsignaturen för parametrarna recvcount och sendcount i rotprocessen. Mängden data som skickas måste vara lika med mängden data som tas emot mellan rotprocessen och varje enskild process. Distinkta typmappningar mellan avsändare och mottagare tillåts fortfarande.

Specifikationen av antal och typer bör inte orsaka att någon plats i roten skrivs mer än en gång. Ett sådant anrop är felaktigt.

Om parametern comm refererar till en intracommunicator skickar alla processer innehållet i dess sändningsbuffert till rotprocessen. Rotprocessen tar emot meddelandena och lagrar dem i rangordning. Resultatet är som om var och en av de n processerna i gruppen som körs ett anrop till MPI_Send(sendbuf, sendcount, sendtype, root, …)och roten hade kört n anrop till MPI_Recv(recvbuf + i*recvcount*extent(recvtype), recvcount, recvtype, i, …). Värdet för extent(recvtype) hämtas med hjälp av funktionen MPI_Type_get_extent . En alternativ beskrivning av funktionen är att de n meddelanden som skickas av processerna i gruppen sammanfogas i rangordning och det resulterande meddelandet tas emot av roten som av ett anrop till MPI_RECV(recvbuf, recvcountn, recvtype, ...). Mottagningsbufferten ignoreras för alla icke-rotprocesser.

Om parametern comm refererar till en intercommunicator omfattar anropet alla processer i intercommunicator, men med en grupp, grupp A, som definierar rotprocessen. Alla processer i den andra gruppen, grupp B, anger samma värde i rotparametern, d.v.s. rotprocessens rangordning i grupp A. Rotprocessen anger värdet MPI_ROOT i rotparametern. Alla andra processer i grupp A anger värdet MPI_PROC_NULL i rotparametern . Data sänds från rotprocessen till alla processer i grupp B. Buffertparametrarna för processerna i grupp B måste vara konsekventa med buffertparametern för rotprocessen.

Krav

Produkt

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

Huvud

Mpi.h; Mpif.h

Bibliotek

Msmpi.lib

DLL

Msmpi.dll

Se även

MPI Collective Functions

MPI_Datatype

MPI_Gather