Page 206 - 6571
P. 206

Виклик функції MPI_Recv не зобов’язаний бути погодженим
                  з  часом  виклику  відповідної  функції  передачі  повідомлення
                  PI_Send – прийом повідомлення може бути ініційований до мо-

                  менту, в момент або після моменту початку відправки повідом-
                  лення.
                        Після  закінчення  функції  MPI_Recv  в  заданому  буфері

                  пам’яті  розташовуватиметься  прийняте  повідомлення.  Принци-
                  повий момент тут полягає в тому, що функція MPI_Recv є бло-
                  куючою  для  процесу-одержувача,  тобто  його  виконання  призу-

                  пиняється  до  завершення  роботи  функції.  Таким  чином,  якщо  з
                  якихось причин очікуване для прийому повідомлення буде відсу-
                  тнє, виконання паралельної програми буде блоковано.

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


                        Лістинг  37  –  Перша  паралельна  програма  з  використанням
                  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);
                              printf("\n Hello from process %3d", RecvRank);
                              }

                          } else
                          // повідомлення, що відправляється усіма процесами,
                          // окрім процесу з рангом 0
                          MPI_Send(&ProcRank, 1, MPI_INT, 0,0, MPI_COMM_WORLD);
                          MPI_Finalize();
                          return 0;


                                                             205
   201   202   203   204   205   206   207   208   209   210   211