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, друга