Page 213 - 6571
P. 213

тися  повідомлення,  що  розсилається,  а  для  усіх  інших  процесів
            вказуваний буфер є призначений для прийому даних, що переда-
            ються;
                  -  усі колективні операції «несумісні» з парними операціями

            – так, наприклад, прийняти широкомовне повідомлення, відісла-
            не за допомогою MPI_Bcast, функцією MPI_Recv не можна, для

            цього можна задіяти тільки MPI_Bcast.
                  Приведемо  програму  для  вирішення  навчального  завдання
            підсумовування  елементів  вектору  з  використанням  розглянутої
            функції (лістинг 38).



                  Лістинг 38 – Паралельна програма підсумовування числових

            значень
                  #include <math.h>
                  #include <stdio.h>
                  #include <stdlib.h>
                  #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;


                                                        212
   208   209   210   211   212   213   214   215   216   217   218