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;
                     }
                     Передача  даних  від  усіх  процесів  одному  процесу(операція  редукції).  У
               розглянутій  програмі  для  підсумовування  числових  значень  наявна
               процедура  збору  і  подальшого  підсумовування  даних  є  прикладом  часто
               виконуваної  колективної  операції  передачі  даних  від  усіх  процесів  одному
   163   164   165   166   167   168   169   170   171   172   173