Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Параллельное программирование на основе MPI.doc
Скачиваний:
121
Добавлен:
11.04.2015
Размер:
941.57 Кб
Скачать

5.3.3. Одновременное выполнение передачи и приема

Одной из часто выполняемых форм информационного взаимодействия в параллельных программахявляется обмен данными междупроцессами, когда для продолжения вычисленийпроцессамнеобходимо отправить данные однимпроцессами в то же время получить сообщения от других. Простейший вариант этой ситуации состоит, например, в обмене данными между двумяпроцессами. Реализация таких обменов при помощи обычных парных операций передачи данных может быть неэффективна, кроме того, такая реализация должна гарантировать отсутствие тупиковых ситуаций, которые могут возникать, например, когда двапроцессаначинают передавать сообщения друг другу с использованием блокирующих функций передачи данных.

Достижение эффективного и гарантированного одновременного выполнения операций передачи и приема данных может быть обеспечено при помощи функции MPI:

int MPI_Sendrecv(void *sbuf,int scount,MPI_Datatype stype,

int dest, int stag, void *rbuf,int rcount,MPI_Datatype rtype,

int source,int rtag, MPI_Comm comm, MPI_Status *status),

где

  • sbuf, scount, stype, dest, stag — параметры передаваемого сообщения;

  • rbuf, rcount, rtype, source, rtag — параметры принимаемого сообщения;

  • comm — коммуникатор, в рамках которого выполняется передача данных;

  • status — структура данных с информацией о результате выполнения операции.

Как следует из описания, функция MPI_Sendrecvпередает сообщение, описываемое параметрами (sbuf, scount, stype, dest, stag),процессус рангомdestи принимает сообщение в буфер, определяемый параметрами (rbuf, rcount, rtype, source, rtag), отпроцессас рангомsource.

В функции MPI_Sendrecvдля передачи и приема сообщений применяются разные буферы. В случае же когда отсылаемое сообщение больше не нужно напроцессе-отправителе, вMPIимеется возможность использования единого буфера:

int MPI_Sendrecv_replace(void *buf, int count, MPI_Datatype type,

int dest, int stag, int source, int rtag, MPI_Comm comm,

MPI_Status* status),

где

  • buf, count, type — параметры передаваемого сообщения;

  • dest — ранг процесса, которому отправляется сообщение;

  • stag — тег для идентификации отправляемого сообщения;

  • source — ранг процесса, от которого выполняется прием сообщения;

  • rtag — тег для идентификации принимаемого сообщения;

  • comm — коммуникатор, в рамках которого выполняется передача данных;

  • status — структура данных с информацией о результате выполнения операции.

Пример использования функций для одновременного выполнения операций передачи и приема приведен в лекции 7при разработкепараллельных программматричного умножения.

5.4. Коллективные операции передачи данных

Как уже отмечалось ранее, под коллективными операциямивMPIпонимаются операции над данными, в которых принимают участие всепроцессыиспользуемого коммуникатора. Выделение основных видов коллективных операций было выполнено влекции 3. Часть коллективных операций уже была рассмотрена в п.5.2.3 – это операции передачи от одногопроцессавсемпроцессамкоммуникатора (широковещательная рассылка) и операции обработки данных, полученных на одномпроцессеот всехпроцессов(редукция данных).

Рассмотрим далее оставшиеся базовые коллективные операции передачи данных.