Dela via


funktionen MPI_Reduce

Utför en global reduce-åtgärd för alla medlemmar i en grupp. Du kan ange en fördefinierad matematisk eller logisk åtgärd eller en programdefinierad åtgärd.

Syntax

int MPIAPI MPI_Reduce(
  _In_      void         *sendbuf,
  _Out_opt_ void         *recvbuf,
            int          count,
            MPI_Datatype datatype,
            MPI_Op       op,
            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 på plats-alternativ 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. Rotprocessen tar sina indata från motsvarande element i mottagningsbufferten och ersätter dem med utdata.

  • recvbuf [ut, valfritt]
    Handtaget till en buffert för att ta emot resultatet av reduce-åtgärden. Den här parametern är bara viktig i rotprocessen.

  • Räkna
    Antalet element som ska skickas från den här processen.

  • Datatyp
    Datatypen för varje element i bufferten. Den här parametern måste vara kompatibel med åtgärden som anges i op-parametern .

  • Op
    Den globala minskningsåtgärd som ska utföras. Referensen kan indikera en inbyggd eller programdefinierad åtgärd. En lista över fördefinierade åtgärder finns i avsnittet MPI_Op .

  • 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_REDUCE(SENDBUF, RECVBUF, COUNT, DATATYPE, OP, ROOT, COMM, IERROR) 
        <type> SENDBUF(*), RECVBUF(*) 
        INTEGER COUNT, DATATYPE, OP, ROOT, COMM, IERROR

Kommentarer

Funktionen MPI_Reduce implementeras med antagandet att den angivna åtgärden är associativ. Alla fördefinierade åtgärder är utformade för att vara associativa och kommutativa. Användare kan definiera åtgärder som är utformade för att vara associativa, men inte kommutativa. Standardutvärderingsordningen för en minskningsåtgärd bestäms av processernas rangordning i gruppen. Implementeringen kan dock dra nytta av associativitet, eller associativitet och kommutativitet för att ändra utvärderingsordningen. Den här processen kan ändra resultatet av minskningen för åtgärder som inte är strikt associativa och kommutativa, till exempel flyttalstillägg.

Vissa program kan inte ignorera den icke-associativa karaktären av flyttalsåtgärder eller använda användardefinierade åtgärder som kräver en särskild utvärderingsordning och inte kan behandlas som associativa. I det här fallet kan du tillämpa utvärderingsordningen explicit. När det till exempel gäller åtgärder som kräver en strikt utvärderingsordning från vänster till höger, eller från höger till vänster, kan du använda följande process:

  1. Samla in alla operander i en enda process, till exempel med hjälp av funktionen MPI_Gather .
  2. Tillämpa reduceringsåtgärden i den ordning som krävs, till exempel med hjälp av funktionen MPI_Reduce_local .
  3. Om det behövs sänder eller sprider du resultatet till de andra processerna.

Anteckning

Det är möjligt att ange olika användardefinierade åtgärder till MPI_Reduce funktion i varje process. Funktionen definierar inte vilka åtgärder som används på vilka operander i det här fallet. Du kan inte göra några antaganden om hur MPI_Reduce funktionen implementeras. Det är säkrast att ange samma åtgärd i varje process.

 

Användardefinierade operatorer kan arbeta med allmänna, härledda datatyper. I det här fallet är varje argument som reduce-åtgärden tillämpas på ett element som beskrivs av en sådan datatyp, som kan innehålla flera grundläggande värden.

Överlappande datatyper tillåts i sändningsbuffertar, men inte i mottagningsbuffertar. Överlappande datatyper i mottagningsbuffertar kan ge oförutsägbara resultat och anses vara ett fel.

Om comm-parametern refererar till en intracommunicator kombinerar funktionen MPI_Reduce elementen enligt vad som anges i indatabufferten för varje process i gruppen och returnerar det kombinerade värdet i rotprocessens utdatabuffert genom att använda den angivna åtgärden.

Indatabufferten och utdatabufferten har samma antal element av samma datatyp. Anropa funktionen i alla gruppmedlemmar med samma värden för parametrarna count, datatype, op, root och comm . Den här metoden säkerställer att alla processer tillhandahåller indatabuffertar och utdatabuffertar av samma längd, med element av samma typ.

Varje process kan ge ett element, eller en sekvens med element, i vilket fall åtgärden körs per element på varje post i sekvensen. Om åtgärden till exempel är MPI_MAX och sändningsbufferten innehåller två element som är flyttalsnummer, tar den recvbuf(1) globala maxgränsen (sendbuf(1)) för och recvbuf(2) tar emot det globala maxvärdet för (sendbuf(2)).

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 . Endast parametrar för att skicka buffert är viktiga i grupp B-processer och endast ta emot buffertparametrar är viktiga i 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

MPI_Op

MPI_Bcast