Page 208 - 6571
P. 208

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

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

                  грамі – за допомогою функції MPI_Comm_rank визначається ранг
                  процесу, а потім відповідно до рангу виділяються необхідні для
                  процесу  ділянки  програмного  коду.  Наявність  в  одній  і  тій  же
                  програмі фрагментів коду різних процесів також значно усклад-

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

                  програмні модулі (функції). Загальна схема MPI-програми в цьо-
                  му випадку матиме вигляд:



                        MPI_Comm_rank(MPI_COMM_WORLD, &ProcRank);
                        if (ProcRank == 0) DoProcess0();

                        else if (ProcRank == 1) DoProcess1();
                        else if (ProcRank == 2) DoProcess2();
                        У багатьох випадках, як і в розглянутому прикладі, викону-

                  вані дії є такими, що відрізняються тільки для процесу з рангом 0.
                  В  цьому  випадку  загальна  схема  MPI-програми  набуває  прості-
                  шого вигляду:

                        MPI_Comm_rank(MPI_COMM_WORLD, &ProcRank);
                        if (ProcRank == 0) DoManagerProcess();
                        else DoWorkerProcesses();

                        На  завершення  обговорення  прикладу  пояснимо  застосова-

                  ний в MPI підхід для контролю правильності виконання функцій.
                  Усі функції MPI  (окрім MPI_Wtime і MPI_Wtick)  повертають в
                  якості свого значення код завершення. При успішному виконанні

                  функції повернений код рівний MPI_SUCCESS. Інші значення ко-
                  ду завершення свідчать про виявлення тих або інших помилкових
                  ситуацій в ході виконання функцій. Для з’ясування типу виявле-

                  ної помилки використовуються іменовані константи, серед яких:
                        -  MPI_ERR_BUFFER – неправильний вказівник на буфер;



                                                             207
   203   204   205   206   207   208   209   210   211   212   213