Page 207 - 6571
P. 207
}
Як випливає з тексту програми, кожен процес визначає свій
ранг, після чого дії в програмі розділяються. Усі процеси, окрім
процесу з рангом 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-програма є деякою «макропрог-
рамою», різні частини якої використовуються різними процеса-
ми. Так, наприклад, в наведеному прикладі програми виділені
рамкою ділянки програмного коду не виконуються одночасно
206