Page 168 - 4868
P. 168
Ошибка! Стиль не определен. 166
#include "mpi.h"
int main(int argc, char* argv[]){
double x[100], TotalSum, ProcSum = 0.0;
int ProcRank, ProcNum, N=100, k, i1, i2;
MPI_Status Status;
// ініціалізація
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&ProcNum);
MPI_Comm_rank(MPI_COMM_WORLD,&ProcRank);
// підготовка даних
if (ProcRank == 0) DataInitialization(x, N);
// розсилка даних на усі процеси
MPI_Bcast(x, N, MPI_DOUBLE, 0, MPI_COMM_WORLD);
// обчислення власної суми на кожному з процесів
// на кожному процесі підсумовуються елементи
// векторуx від i1 до i2
k = N / ProcNum;
i1 = k * ProcRank;
i2 = k * ( ProcRank + 1);
if (ProcRank == ProcNum - 1) i2 = N;
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, MPI_COMM_WORLD);
}
// виведення результату
if (ProcRank == 0)
printf("\nTotal Sum = %10.2f", TotalSum);
MPI_Finalize();
return 0;
}
Передача даних від усіх процесів одному процесу(операція редукції). У
розглянутій програмі для підсумовування числових значень наявна
процедура збору і подальшого підсумовування даних є прикладом часто
виконуваної колективної операції передачі даних від усіх процесів одному