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
   209   210   211   212   213   214   215   216   217   218   219