Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 |