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