Page 161 - 4868
P. 161
159 Ошибка! Стиль не определен.
параметр tag використовується тільки при необхідності розрізнення
повідомлень, що передаються, інакше в якості значення параметра може бути
використане довільне позитивне ціле число.
Відразу ж після завершення функції MPI_Send процес-відправник може
почати повторно використовувати буфер пам’яті, в якому розташовувалося
повідомлення, що відправлялося. Також слід розуміти, що у момент
завершення функції MPI_Send стан самого повідомлення, що пересилається,
може бути абсолютно різним: повідомлення може розташовуватися в
процесі-відправнику, може знаходитися в стані передачі, може зберігатися в
процесі-одержувачу або може бути прийнято процесом-одержувачем за
допомогою функції MPI_Recv. Тим самим, завершення функції MPI_Send
означає лише, що операція передачі почала виконуватися і пересилка
повідомлення рано чи пізно буде виконана.
Для прийому повідомлення процес- одержувач повинен виконати
функцію:
int MPI_Recv(void *buf, int count, MPI_Datatype type,
int source int tag, MPI_Comm comm, MPI_Status *status)
де
buf, count, type – буфер пам’яті для прийому повідомлення,
призначення кожного окремого параметра відповідає опису в MPI_Send;
source – ранг процесу, від якого має бути виконаний прийом
повідомлення;
tag – тег повідомлення, яке має бути прийняте для процесу;
comm – комунікатор, у рамках якого виконується передача даних;
status – вказівник на структуру даних з інформацією про результат
виконання операції прийому даних.
Слід зазначити, що:
буфер пам’яті має бути достатнім для прийому повідомлення. При
нестачі пам’яті частина повідомлення буде втрачена і в коді завершення
функції буде зафіксована помилка переповнення;
з іншого боку, повідомлення, що приймається, може бути і коротше,
ніж розмір приймального буфера, у такому разі зміняться тільки ділянки
буфера, зачеплені прийнятим повідомленням;
типи елементів повідомлення, що приймається, повинні співпадати;
при необхідності прийому повідомлення від будь-якого процесу-
відправника для параметра source може бути вказане значення
MPI_ANY_SOURCE (на відміну від функції передачі MPI_Send, яка посилає
повідомлення строго визначеному адресату);
при необхідності прийому повідомлення з будь-яким тегом для
параметра tag може бути вказане значення MPI_ANY_TAG (знову-таки, при
використанні функції MPI_Send має бути вказане конкретне значення тега);
на відміну від параметрів «процес-одержувач» і «тег», параметра
«комунікатор» не має значення, що означає «будь-якого комунікатора»;