Page 211 - 6571
P. 211

що дозволяє визначити час в секундах між двома послідовними
            показниками           часу      апаратного          таймера        використовуваної
            комп’ютерної системи.


                  22.2 Колективні операції передачі даних у MPI



                  Функції  MPI_Send  і  MPI_Recv,  забезпечують  можливість
            виконання парних операцій передачі даних між двома процесами
            паралельної програми. Для виконання комунікаційних колектив-

            них операцій, в яких беруть участь усі процеси комунікатора, в
            MPI передбачений спеціальний набір функцій. У цьому підрозді-
            лі будуть розглянуті три такі функції, широко вживані навіть при
            розробці порівняно простих паралельних програм.

                  Для демонстрації застосування даних MPI-функцій викорис-
            таємо навчальну задачу підсумовування елементів вектора x:

                                                          n
                                                    S =  ∑   x
                                                              i
                                                         i= 1
                  Розробка паралельного алгоритму для вирішення даної задачі
            не  викликає  важкості:  необхідно  розділити  дані  на  рівні  блоки,
            передати ці блоки процесам, виконати в процесах підсумовуван-
            ня отриманих даних, зібрати значення вичислених власних сум на

            одному з процесів і скласти значення власних сум для отримання
            загального результату вирішуваної задачі. При подальшій розро-
            бці  демонстраційних  програм  цей  алгоритм  буде  дещо  спроще-

            ний: процесам програми передаватиметься увесь підсумовуваний
            вектор, а не окремі блоки цього вектору.
                  Передача даних від одного процесу усім процесам програми.
            Перше завдання при виконанні розглянутого паралельного алго-

            ритму  підсумовування  полягає  в  необхідності  передачі  значень
            вектору  x  усім  процесам  паралельної  програми.  Звичайно,  для
            вирішення цього завдання можна скористатися розглянутими ра-

            ніше функціями парних операцій передачі даних :
                  MPI_Comm_size(MPI_COMM_WORLD, &ProcNum);

                  for (int i = 1; i < ProcNum; i++)
                    MPI_Send(&x, n, MPI_DOUBLE, i, 0, MPI_COMM_WORLD);

                  Проте, таке рішення буде вкрай неефективним, оскільки по-
            вторення операцій передачі призводить до підсумовування витрат



                                                        210
   206   207   208   209   210   211   212   213   214   215   216