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