Udostępnij za pośrednictwem


MPI_Reduce, funkcja

Wykonuje operację globalnej redukcji we wszystkich członkach grupy. Można określić wstępnie zdefiniowaną operację matematyczną lub logiczną albo operację zdefiniowaną przez aplikację.

Składnia

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]
    Dojście do buforu zawierającego dane do wysłania do procesu głównego.

    Jeśli parametr comm odwołuje się do wewnątrzkomunikatora, można określić opcję w miejscu, określając MPI_IN_PLACE we wszystkich procesach. Parametry sendcount i sendtype są ignorowane. Każdy proces wprowadza dane w odpowiednim elemecie buforu odbierania. Nproces wysyła dane do nelementu buforu odbierania. Proces główny pobiera dane wejściowe z odpowiedniego elementu buforu odbierania i zastępuje je danymi wyjściowymi.

  • recvbuf [out, opcjonalnie]
    Dojście do buforu w celu otrzymania wyniku operacji redukcji. Ten parametr jest znaczący tylko w procesie głównym.

  • Liczba
    Liczba elementów do wysłania z tego procesu.

  • Datatype
    Typ danych każdego elementu w buforze. Ten parametr musi być zgodny z operacją określoną w parametrze op .

  • Op
    Globalna operacja redukcji do wykonania. Uchwyt może wskazywać wbudowaną lub zdefiniowaną przez aplikację operację. Aby uzyskać listę wstępnie zdefiniowanych operacji, zobacz temat MPI_Op .

  • Głównego
    Ranga procesu odbierania w określonym komunikatorze.

  • Comm
    Uchwyt komunikatora MPI_Comm .

Wartość zwracana

Zwraca MPI_SUCCESS po powodzeniu. W przeciwnym razie zwracana wartość jest kodem błędu.

W fortran wartość zwracana jest przechowywana w parametrze IERROR .

Fortran

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

Uwagi

Funkcja MPI_Reduce jest implementowana z założeniem, że określona operacja jest skojarzona. Wszystkie wstępnie zdefiniowane operacje mają być asocjacyjne i zmutacyjne. Użytkownicy mogą definiować operacje przeznaczone do asocjacji, ale nie dojeżdżające. Domyślna kolejność oceny operacji redukcji jest określana przez szeregi procesów w grupie. Jednak implementacja może korzystać z asocjacji lub kojarzenia i commutativity, aby zmienić kolejność oceny. Ten proces może zmienić wynik redukcji operacji, które nie są ściśle kojarzące i kommutacyjne, takie jak dodawanie zmiennoprzecinkowe.

Niektóre aplikacje nie mogą ignorować kojarzącego charakteru operacji zmiennoprzecinkowych lub mogą używać operacji zdefiniowanych przez użytkownika, które wymagają specjalnej kolejności oceny i nie mogą być traktowane jako asocjacyjne. W takim przypadku można jawnie wymusić kolejność oceny. Na przykład w przypadku operacji wymagających ścisłej lewej do prawej lub od prawej do lewej kolejności oceny można użyć następującego procesu:

  1. Zbierz wszystkie operandy w jednym procesie, na przykład przy użyciu funkcji MPI_Gather .
  2. Zastosuj operację redukcji w wymaganej kolejności, na przykład przy użyciu funkcji MPI_Reduce_local .
  3. W razie potrzeby rozgłasz lub rozrzuć wynik do innych procesów.

Uwaga

W każdym procesie można podać różne operacje zdefiniowane przez użytkownika do funkcji MPI_Reduce . Funkcja nie definiuje, które operacje są używane na których operandach w tym przypadku. Nie można założyć żadnych założeń dotyczących sposobu implementacji funkcji MPI_Reduce . Najbezpieczniej jest określić tę samą operację w każdym procesie.

 

Operatory zdefiniowane przez użytkownika mogą działać na ogólnych, pochodnych typach danych. W takim przypadku każdy argument, do którego zastosowano operację redukcji, jest jednym elementem opisanym przez taki typ danych, który może zawierać kilka podstawowych wartości.

Nakładające się typy danych są dozwolone w buforach wysyłania, ale nie w buforach odbierania. Nakładające się typy danych w buforach odbierania mogą dawać nieprzewidywalne wyniki i są uznawane za błąd.

Jeśli parametr comm odwołuje się do wewnątrzpolecenia, funkcja MPI_Reduce łączy elementy określone w buforze wejściowym każdego procesu w grupie, a przy użyciu określonej operacji zwraca wartość połączoną w buforze wyjściowym procesu głównego.

Bufor wejściowy i bufor wyjściowy mają taką samą liczbę elementów tego samego typu danych. Wywołaj funkcję we wszystkich elementach członkowskich grupy, używając tych samych wartości dla parametrów count, datatype, op, root i comm . Dzięki temu wszystkie procesy zapewniają bufory wejściowe i bufory wyjściowe o tej samej długości, z elementami tego samego typu.

Każdy proces może dostarczyć jeden element lub sekwencję elementów, w tym przypadku operacja jest wykonywana dla każdego elementu w każdym wpisie sekwencji. Jeśli na przykład operacja jest MPI_MAX, a bufor wysyłania zawiera dwa elementy, które są liczbami zmiennoprzecinkowymi, recvbuf(1) otrzyma maksymalną globalną wartość (sendbuf(1)) i recvbuf(2) otrzyma maksymalną wartość globalną .(sendbuf(2))

Jeśli parametr comm odwołuje się do interpolenicy, wywołanie obejmuje wszystkie procesy w interpoluniku, ale z jedną grupą, grupą A, która definiuje proces główny. Wszystkie procesy w innej grupie, grupa B, ustaw tę samą wartość w parametrze głównym , czyli rangę procesu głównego w grupie A. Proces główny ustawia wartość MPI_ROOT w parametrze głównym . Wszystkie inne procesy w grupie A ustaw wartość MPI_PROC_NULL w parametrze głównym . Tylko parametry buforu wysyłania są istotne w procesach grupy B i tylko parametry buforu odbierania są istotne w procesie głównym.

Wymagania

Produkt

Pakiet redystrybucyjny HPC Pack 2012 MS-MPI, pakiet redystrybucyjny HPC Pack 2008 R2 MS-MPI, pakiet redystrybucyjny HPC Pack 2008 MS-MPI lub narzędzia klienckie HPC Pack 2008

Nagłówek

Mpi.h; Mpif.h

Biblioteka

Msmpi.lib

DLL

Msmpi.dll

Zobacz też

Funkcje zbiorowe MPI

MPI_Datatype

MPI_Gather

MPI_Op

MPI_Bcast