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:
- Zbierz wszystkie operandy w jednym procesie, na przykład przy użyciu funkcji MPI_Gather .
- Zastosuj operację redukcji w wymaganej kolejności, na przykład przy użyciu funkcji MPI_Reduce_local .
- 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 |