НОУ ІНТУІТ, Лекція, Двоточкові обміни
Двоточковий обмін із буферизацією
Надсилання повідомлення в буферизованому режимі може бути розпочато незалежно від того, чи зареєстрований відповідний прийом. Джерело копіює повідомлення в буфер , а потім передає його в режимі, що не блокує.
Розмір буфера повинен перевищувати розмір повідомлення на величину MPI_BSEND_OVERHEAD. Цей додатковий простір використовується підпрограмою буферизованої передачі для своїх цілей.
Якщо перед виконанням операції буферизованого обміну не виділено буфер , MPI поводиться так, якби з процесом був пов'язаний буфер нульового розміру. Робота з таким буфером зазвичай завершується збоєм програми.
Буферизований обмін рекомендується використовувати в тих ситуаціях, коли програміст потребує більшого контролю над розподілом пам'яті. Цей режим зручний і налагодження, оскільки причину переповнення буфера визначити легше, ніж причину глухого кута.
Під час виконання буферизованого обміну програміст повинен заздалегідь створити буфер достатнього розміру:
Внаслідок виклику створюється буфер buf розміром size байтів. У програмах на мові Fortran роль буфера може грати масив. За один раз до процесу може бути підключений лише один буфер.
Після завершення роботи з буфером його необхідно вимкнути:
Приклад програми, яка використовує обмін із буферизацією
Інші різновиди двоточкового обміну
Синхронний обмін
Завершення передачі відбувається лише після того, як прийом повідомлення ініціалізований іншим процесом. Адресат надсилає джерелу "квитанцію" - повідомлення про завершення прийому. Після отримання цього повідомлення обмін вважається завершеним та джерело "знає", що його повідомлення отримано:
Обмін "за готовністю"
Передача"за готовністю" виконується за допомогою підпрограми MPI_Rsend:
Передача "по готовності" має починатися, якщо вже зареєстровано відповідний прийом. У разі недотримання цієї умови результат виконання операції не визначено.
Спільні прийом та передача
Операції прийому передачі об'єднують в єдиному виклику передачу повідомлення одному процесу прийом повідомлення від іншого процесу. Даний вид обмінів може виявитися корисним при виконанні складних схем обміну повідомленнями, наприклад, ланцюгами процесів.
Підпрограми прийому можуть взаємодіяти зі звичайними підпрограмами обміну і підпрограмами зондування.
Підпрограма MPI_Sendrecv виконує прийом та передачу даних із блокуванням:
Є різновиди операції приймання.
Підпрограма MPI_Sendrecv_replace виконує прийом та передачу даних, використовуючи загальний буфер для передачі та прийому: