Page 163 - 4868
P. 163

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

                           printf("\n Hello from process %3d", RecvRank);
                           }
                       } else
                       // повідомлення, що відправляється усіма процесами,
                       // окрім процесу з рангом 0
                       MPI_Send(&ProcRank, 1, MPI_INT, 0,0, MPI_COMM_WORLD);
                       MPI_Finalize();
                       return 0;
                     }

                     Як випливає з тексту програми, кожен процес визначає свій ранг, після
               чого  дії  в  програмі  розділяються.  Усі  процеси,  окрім  процесу  з  рангом  0,
               передають  значення  свого  рангу  нульовому  процесу.  Процес  з  рангом  0
               спочатку  друкує  значення  свого  рангу,  а  далі  послідовно  приймає
               повідомлення  з  рангами  процесів  і  також  друкує  їх  значення.  При  цьому
               важливо  відмітити,  що  порядок  прийому  повідомлень  заздалегідь  не
               визначений  і  залежить  від  умов  виконання  паралельної  програми  (більше
               того,  цей  порядок  може  змінюватися  від  запуску  до  запуску).  Можливий
               варіант  результатів  друку  процесу  0  може  мати  наступний  вигляд  (для
               паралельної програми, що складається з чотирьох процесів):
                     Hello from process 0
                     Hello from process 2
                     Hello from process 1
                     Hello from process 3

                     Такий  «плаваючий»  вид  отриманих  результатів  істотним  чином
               ускладнює розробку, тестування і відладку паралельних програм, оскільки в
               цьому  випадку  зникає  один  з  основних  принципів  програмування  –
               повторюваність  виконуваних  обчислювальних  експериментів.  Як  правило,
               якщо  це  не  призводить  до  втрати  ефективності,  слід  забезпечувати
               однозначність  розрахунків  і  при  використанні  паралельних  обчислень.  Для
               даного  простого  прикладу  можна  відновити  постійність  отримуваних
               результатів  за  допомогою  завдання  рангу  процесу-відправнику  в  операції
               прийому повідомлення:

                     MPI_Recv(&RecvRank, 1, MPI_INT, i, MPI_ANY_TAG,
                         MPI_COMM_WORLD&Status).

                     Вказівка  рангу  процесу-відправника  регламентує  порядок  прийому
               повідомлень,  і,  як  результат,  рядки  друку  з’являтимуться  строго  в  порядку
               зростання  рангів  процесів  (така  регламентація  в  окремих  ситуаціях  може
               призводити до уповільнення виконуваних паралельних обчислень).
                     В загальному випадку MPI-програма є деякою «макропрограмою», різні
               частини  якої  використовуються  різними  процесами.  Так,  наприклад,  в
               наведеному  прикладі  програми  виділені  рамкою  ділянки  програмного  коду
               не  виконуються  одночасно  жодним  з  процесів.  Перша  виділена  ділянка  з
               функцією прийому MPI_Recv виконується тільки процесом з рангом 0, друга
   158   159   160   161   162   163   164   165   166   167   168