Page 166 - 4868
P. 166

Ошибка! Стиль не определен.                                                              164

               паралельної  програми.  Для  визначення  поточного  значення  точності  може
               бути використана функція:

                     double MPI_Wtick(void)

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

                     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);

                     Проте  таке  рішення  буде  вкрай  неефективним,  оскільки  повторення
               операцій  передачі  призводить  до  підсумовування  витрат  (латентностей)  на
               підготовку повідомлень, що передаються. Така операція може бути виконана
               за log 2p ітерацій передачі даних.
                     Досягнення ефективного виконання операції передачі даних від одного
               процесу усім процесам програми (широкомовна розсилка даних ) може бути
               забезпечена за допомогою наступної функції MPI:

                     int  MPI_Bcast(void  *buf,  int  count,  MPI_Datatype  type,  int
               root, MPI_Comm comm)
   161   162   163   164   165   166   167   168   169   170   171