Page 214 - 6571
P. 214
for ( int i = i1; i < i2; i++ )
ProcSum = ProcSum + x[i];
// збирання сум на процесі з рангом 0
if (ProcRank == 0){
TotalSum = ProcSum;
for (int i=1; i < ProcNum; i++){
MPI_Recv(&ProcSum, 1, MPI_DOUBLE, MPI_ANY_SOURCE, 0,
MPI_COMM_WORLD, &Status);
TotalSum = TotalSum + ProcSum;
}
} else // усі процеси посилають свої власні суми
MPI_Send(&ProcSum, 1, MPI_DOUBLE, 0, 0, M
I_COMM_WORLD);
}
// виведення результату
if (ProcRank == 0)
printf("\nTotal Sum = %10.2f", TotalSum);
MPI_Finalize();
return 0;
}
Передача даних від усіх процесів одному процесу(операція
редукції). У розглянутій програмі для підсумовування числових
значень наявна процедура збору і подальшого підсумовування
даних є прикладом часто виконуваної колективної операції пере-
дачі даних від усіх процесів одному процесу. У цій операції над
збираними значеннями здійснюється та або інша обробка даних
(для підкреслення останнього моменту ця операція ще іменується
операцією редукції даних ). Як і раніше, реалізація операції реду-
кції за допомогою звичайних парних операцій передачі даних є
неефективною і досить трудомісткою. Для найкращого виконан-
ня дій, пов’язаних з редукцією даних, в MPI передбачена функ-
ція:
int MPI_Reduce(void *sendbuf, void *recvbuf, int count,
MPI_Datatype type, MPI_Op op, int root, MPI_Comm
comm)
де sendbuf – буфер пам’яті з повідомленням, що відправляєть-
ся;
recvbuf – буфер пам’яті для результуючого повідомлення
(тільки для процесу з рангом root );
count – кількість елементів в повідомленнях;
213