
- •ФіЛабораторна робота № 2
- •1. Теоретичні відомості
- •1.1 Термінологія і позначення
- •1.2 Загальні процедури mpi
- •1.3 Прийом/передача повідомлень із блокуванням (синхронні процедури)
- •1.4 Прийом/передача повідомлень без блокування (асинхронні процедури)
- •1.4 Визначені константи типу елементів повідомлень
- •2. Хід роботи
- •4. Контрольні питання
- •5. Список літератури
1.4 Прийом/передача повідомлень без блокування (асинхронні процедури)
Перевага функцій прийому/передачі без блокування особливо помітна, коли час передачі даних між паралельними процесами є досить значним і передача/прийом повідомлень чергується з обчислювальними операціями над цими даними.
int MPI_Isend(void *buf, int count, MPI_Datatype datatype, int dest, int msgtag, MPI_Comm comm, MPI_Request *request)
buf - адреса початку буфера посилки повідомлення
count - число переданих елементів у повідомленні
datatype - тип переданих елементів
dest - номер процесу-одержувача
msgtag - ідентифікатор повідомлення
comm - ідентифікатор групи
OUT request - ідентифікатор асинхронної передачі
Передача повідомлення, аналогічна MPI_Send, однак повернення з підпрограми відбувається відразу після ініціалізації процесу передачі без очікування обробки всього повідомлення, що перебуває в буфері buf. Це означає, що не можна повторно використати даний буфер для інших цілей без одержання додаткової інформації про завершення даної посилки. Закінчення процесу передачі (тобто того моменту, коли можна перевикористати буфер buf без побоювання зіпсувати передане повідомлення) можна визначити за допомогою параметра request і процедур MPI_Wait і MPI_Test.
Повідомлення, відправлене кожною із процедур MPI_Send і MPI_Isend, може бути прийнято кожною із процедур MPI_Recv і MPI_Irecv.
int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int source, int msgtag, MPI_Comm comm, MPI_Request *request)
OUT buf - адреса початку буфера прийому повідомлення
count - максимальне число елементів у прийнятому повідомленні
datatype - тип елементів прийнятого повідомлення
source - номер процесу-відправника
msgtag - ідентифікатор прийнятого повідомлення
comm - ідентифікатор групи
OUT request - ідентифікатор асинхронного прийому повідомлення
Прийом повідомлення, аналогічний MPI_Recv, однак повернення з підпрограми відбувається відразу після ініціалізації процесу прийому без очікування одержання повідомлення в буфері buf. Закінчення процесу прийому можна визначити за допомогою параметра request і процедур MPI_Wait і MPI_Test.
int MPI_Wait( MPI_Request *request, MPI_Status *status)
request - ідентифікатор асинхронного прийому або передачі
OUT status - параметри повідомлення
Очікування завершення асинхронних процедур MPI_Isend або MPI_Irecv, асоційованих з ідентифікатором request. У випадку прийому, атрибути й довжину отриманого повідомлення можна визначити звичайним образом за допомогою параметра status.
int MPI_Waitall( int count, MPI_Request *requests, MPI_Status *statuses)
count - число ідентифікаторів
requests - масив ідентифікаторів асинхронного прийому або передачі
OUT statuses - параметри повідомлень
Виконання процесу блокується доти, поки всі операції обміну, асоційовані із зазначеними ідентифікаторами, не будуть завершені. Якщо під час однієї або декількох операцій обміну виникли помилки, то поле помилки в елементах масиву statuses буде встановлено у відповідне значення.
int MPI_Waitany( int count, MPI_Request *requests, int *index, MPI_Status *status)
count - число ідентифікаторів
requests - масив ідентифікаторів асинхронного прийому або передачі
OUT index - номер завершеної операції обміну
OUT status - параметри повідомлень
Виконання процесу блокується доти, поки яка-небудь операція обміну, асоційована із зазначеними ідентифікаторами, не буде завершена. Якщо кілька операцій можуть бути завершені, то випадковим чином вибирається одна з них. Параметр index містить номер елемента в масиві requests, що містить ідентифікатор завершеної операції.
int MPI_Waitsome( int incount, MPI_Request *requests, int *outcount, int *indexes, MPI_Status *statuses)
incount - число ідентифікаторів
requests - масив ідентифікаторів асинхронного прийому або передачі
OUT outcount - число ідентифікаторів операцій, що завершилися, обміну
OUT indexes - масив номерів операції, що завершилася, обміну
OUT statuses - параметри повідомлень, що завершилися
Виконання процесу блокується доти, поки принаймні одна з операцій обміну, асоційованих із зазначеними ідентифікаторами, не буде завершена. Параметр outcount містить число завершених операцій, а перші outcount елементів масиву indexes містять номера елементів масиву requests з їхніми ідентифікаторами. Перші outcount елементів масиву statuses містять параметри завершених операцій.
int MPI_Test( MPI_Request *request, int *flag, MPI_Status *status)
request - ідентифікатор асинхронного прийому або передачі
OUT flag - ознака завершення операції обміну
OUT status - параметри повідомлення
Перевірка завершення асинхронних процедур MPI_Isend або MPI_Irecv, асоційованих з ідентифікатором request. У параметрі flag повертає значення 1, якщо відповідна операція завершена, і значення 0 у противному випадку. Якщо завершено процедуру прийому, то атрибути й довжину отриманого повідомлення можна визначити звичайним чином за допомогою параметра status.
int MPI_Testall( int count, MPI_Request *requests, int *flag, MPI_Status *statuses)
count - число ідентифікаторів
requests - масив ідентифікаторів асинхронного прийому або передачі
OUT flag - ознака завершення операцій обміну
OUT statuses - параметри повідомлень
У параметрі flag повертає значення 1, якщо всі операції, асоційовані із зазначеними ідентифікаторами, завершені (із вказівкою параметрів повідомлень у масиві statuses). У іншому випадку повертається 0, а елементи масиву statuses невизначені.
int MPI_Testany(int count, MPI_Request *requests, int *index, int *flag, MPI_Status *status)
count - число ідентифікаторів
requests - масив ідентифікаторів асинхронного прийому або передачі
OUT index - номер завершеної операції обміну
OUT flag - ознака завершення операції обміну
OUT status - параметри повідомлення
Якщо до моменту виклику підпрограми хоча б одна з операцій обміну завершилася, то в параметрі flag повертається значення 1, index містить номер відповідного елемента в масиві requests, а status - параметри повідомлення.
int MPI_Testsome( int incount, MPI_Request *requests, int *outcount, int *indexes, MPI_Status *statuses)
incount - число ідентифікаторів
requests - масив ідентифікаторів асинхронного прийому або передачі
OUT outcount - число ідентифікаторів операцій, що завершилися, обміну
OUT indexes - масив номерів операції, що завершилася, обміну
OUT statuses - параметри операцій, що завершилися
Дана підпрограма працює так само, як і MPI_Waitsome, за винятком того, що повернення відбувається негайно. Якщо жодна із зазначених операцій не завершилася, то значення outcount буде дорівнює нулю.
int MPI_Iprobe( int source, int msgtag, MPI_Comm comm, int *flag, MPI_Status *status)
source - номер процесу-відправника або MPI_ANY_SOURCE
msgtag - ідентифікатор очікуваного повідомлення або MPI_ANY_TAG
comm - ідентифікатор групи
OUT flag - ознака завершення операції обміну
OUT status - параметри виявленого повідомлення
Одержання інформації про надходження й структуру очікуваного повідомлення без блокування. У параметр flag повертає значення 1, якщо повідомлення з потрібними атрибутами вже може бути прийнято (у цьому випадку її дія повністю аналогічна MPI_Probe), і значення 0, якщо повідомлення із зазначеними атрибутами ще немає.