Page 162 - 4868
P. 162

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

                       параметр status дозволяє визначити ряд характеристик прийнятого

               повідомлення:
                        1) status.MPI_SOURCE  –  ранг  процеса-відправника  прийнятого
                          повідомлення;
                        2) status.MPI_TAG – тег прийнятого повідомлення.
                     Приведені  значення  MPI_ANY_SOURCE  і  MPI_ANY_TAG  іноді  називають
               джокерами.
                     Значення змінної status дозволяє визначити кількість елементів даних
               в прийнятому повідомленні за допомогою функції:
                     int MPI_Get_count(MPI_Status *status, MPI_Datatype type,
                           int *count)

               де
                       status – статус операції MPI_Recv;
                       type – тип прийнятих даних;
                       count – кількість елементів даних в повідомленні.
                     Виклик  функції  MPI_Recv  не  зобов’язаний  бути  погодженим  з  часом

               виклику  відповідної  функції  передачі  повідомлення  MPI_Send  –  прийом
               повідомлення  може  бути  ініційований  до  моменту,  в  момент  або  після
               моменту початку відправки повідомлення.
                     Після  закінчення  функції  MPI_Recv  в  заданому  буфері  пам’яті
               розташовуватиметься  прийняте  повідомлення.  Принциповий  момент  тут
               полягає в тому, що функція MPI_Recv є блокуючою для процесу-одержувача,
               тобто його виконання призупиняється до завершення роботи функції. Таким
               чином,  якщо  з  якихось  причин  очікуване  для  прийому  повідомлення  буде
               відсутнє, виконання паралельної програми буде блоковано.
                     Розглянутий  набір  функцій  є  достатнім  для  розробки  паралельних
               програм.  Програма,  що  наводиться  нижче  (лістинг  2.7),  є  стандартним
               початковим прикладом для алгоритмічної мови C.

                     Лістинг 2.7– Перша паралельна програма з використанням MPI
                     #include <stdio.h>
                     #include "mpi.h"
                     int main(int argc, char* argv[]){
                       int ProcNum, ProcRank, RecvRank;
                       MPI_Status Status;
                       MPI_Init(&argc, &argv);
                       MPI_Comm_size(MPI_COMM_WORLD, &ProcNum);
                       MPI_Comm_rank(MPI_COMM_WORLD, &ProcRank);
                       if (ProcRank == 0){
                       // дії, що виконуються тільки процесом з рангом 0
                         printf("\n Hello from process %3d", ProcRank);
                         for (int i = 1; i < ProcNum; i++){
                           MPI_Recv(&RecvRank, 1, MPI_INT, MPI_ANY_SOURCE,
                               MPI_ANY_TAG, MPI_COMM_WORLD, &Status);
   157   158   159   160   161   162   163   164   165   166   167