Sdílet prostřednictvím


MPI_Reduce funkce

Provede globální operaci redukce ve všech členech skupiny. Můžete zadat předdefinovanou matematickou nebo logickou operaci nebo operaci definovanou aplikací.

Syntaxe

int MPIAPI MPI_Reduce(
  _In_      void         *sendbuf,
  _Out_opt_ void         *recvbuf,
            int          count,
            MPI_Datatype datatype,
            MPI_Op       op,
            int          root,
            MPI_Comm     comm
);

Parametry

  • sendbuf [in]
    Popisovač vyrovnávací paměti, která obsahuje data, která se mají odeslat do kořenového procesu.

    Pokud parametr comm odkazuje na intrakomunikator, můžete zadat možnost na místě zadáním MPI_IN_PLACE ve všech procesech. Parametry sendcount a sendtype jsou ignorovány. Každý proces zadává data do odpovídajícího elementu vyrovnávací paměti pro příjem. N.proces odešle data do nth elementu vyrovnávací paměti pro příjem. Kořenový proces přebírá vstupní data z odpovídajícího prvku vyrovnávací paměti pro příjem a nahradí je výstupními daty.

  • recvbuf [out, volitelné]
    Popisovač vyrovnávací paměti pro příjem výsledku operace redukce. Tento parametr je významný pouze v kořenovém procesu.

  • Počet
    Počet prvků, které se mají z tohoto procesu odeslat.

  • Datatype
    Datový typ každého prvku ve vyrovnávací paměti. Tento parametr musí být kompatibilní s operací, jak je uvedeno v parametru op .

  • Op
    Globální operace redukce, která se má provést. Popisovač může znamenat integrovanou operaci nebo operaci definovanou aplikací. Seznam předdefinovaných operací najdete v tématu MPI_Op .

  • Kořenové
    Pořadí procesu příjmu v zadaném komunikátoru.

  • Komunikace
    Popisovač MPI_Comm communicatoru.

Vrácená hodnota

Vrátí MPI_SUCCESS při úspěchu. V opačném případě je návratovou hodnotou kód chyby.

V nástroji Fortran je vrácená hodnota uložena v parametru IERROR .

Fortran

    MPI_REDUCE(SENDBUF, RECVBUF, COUNT, DATATYPE, OP, ROOT, COMM, IERROR) 
        <type> SENDBUF(*), RECVBUF(*) 
        INTEGER COUNT, DATATYPE, OP, ROOT, COMM, IERROR

Poznámky

Funkce MPI_Reduce se implementuje s předpokladem, že zadaná operace je asociativní. Všechny předdefinované operace jsou navržené tak, aby byly asociativní a komutativní. Uživatelé můžou definovat operace, které jsou navržené tak, aby byly asociativní, ale ne komutativní. Výchozí pořadí vyhodnocení operace redukce je určeno pořadím procesů ve skupině. Implementace však může využít asociativitu nebo asociativitu a komutativitu ke změně pořadí hodnocení. Tento proces může změnit výsledek snížení u operací, které nejsou výhradně asociativní a komutativní, například sčítání s plovoucí desetinou čárkou.

Některé aplikace nemohou ignorovat asociativní povahu operací s plovoucí desetinnou čárkou nebo mohou používat uživatelem definované operace, které vyžadují zvláštní pořadí vyhodnocení a nelze je považovat za asociativní. V takovém případě můžete pořadí vyhodnocení vynutit explicitně. Například v případě operací, které vyžadují striktní pořadí vyhodnocení zleva doprava nebo zprava doleva, můžete použít následující postup:

  1. Shromážděte všechny operandy v jednom procesu, například pomocí funkce MPI_Gather .
  2. Použijte operaci redukce v požadovaném pořadí, například pomocí funkce MPI_Reduce_local .
  3. V případě potřeby vysměrujte nebo rozptýlejte výsledek do ostatních procesů.

Poznámka

V každém procesu je možné do funkce MPI_Reduce zadat různé operace definované uživatelem. Funkce nedefinuje, které operace se v tomto případě používají pro které operandy. Nemůžete předpokládat, jak je funkce MPI_Reduce implementována. Nejbezpečnější je zadat stejnou operaci v každém procesu.

 

Uživatelem definované operátory můžou fungovat na obecných odvozených datových typech. V tomto případě je každý argument, na který je použita operace redukce, jedním prvkem, který je popsán takovým datovým typem, který může obsahovat několik základních hodnot.

Překrývající se datové typy jsou povoleny ve vyrovnávacích pamětích pro odesílání, ale ne v vyrovnávacích pamětích pro příjem. Překrývající se datové typy v příjmových vyrovnávacích pamětích můžou poskytovat nepředvídatelné výsledky a považují se za chybu.

Pokud parametr comm odkazuje na intrakomunikator, funkce MPI_Reduce kombinuje prvky uvedené ve vstupní vyrovnávací paměti každého procesu ve skupině a pomocí zadané operace vrátí kombinovanou hodnotu ve výstupní vyrovnávací paměti kořenového procesu.

Vstupní a výstupní vyrovnávací paměť mají stejný počet prvků stejného datového typu. Volání funkce ve všech členech skupiny pomocí stejných hodnot pro parametry count, datatype, op, root a comm . Tento postup zajišťuje, že všechny procesy poskytují vstupní a výstupní vyrovnávací paměti stejné délky s prvky stejného typu.

Každý proces může poskytnout jeden prvek nebo sekvenci prvků, v takovém případě se operace provádí pro každý prvek na každém záznamu sekvence. Pokud je například operace MPI_MAX a vyrovnávací paměť odesílání obsahuje dva prvky, které jsou čísla s plovoucí desetinou čárkou, pak recvbuf(1) obdrží globální maximum (sendbuf(1)) a recvbuf(2) obdrží globální maximum hodnoty (sendbuf(2)).

Pokud parametr comm odkazuje na interkomunikátor, pak volání zahrnuje všechny procesy v interkomunikátoru, ale s jednou skupinou, skupinou A, která definuje kořenový proces. Všechny procesy v druhé skupině, skupině B, nastavují stejnou hodnotu v kořenovém parametru, tj. pořadí kořenového procesu ve skupině A. Kořenový proces nastaví hodnotu MPI_ROOT v kořenovém parametru. Všechny ostatní procesy ve skupině A nastavují hodnotu MPI_PROC_NULL v kořenovém parametru. V procesech skupiny B jsou významné pouze parametry vyrovnávací paměti pro odesílání a v kořenovém procesu jsou významné pouze parametry vyrovnávací paměti pro příjem.

Požadavky

Produkt

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

Hlavička

Mpi.h; Mpif.h

Knihovna

Msmpi.lib

DLL

Msmpi.dll

Viz také

Kolektivní funkce MPI

MPI_Datatype

MPI_Gather

MPI_Op

MPI_Bcast