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);