Параллельное программирование в стандарте MPI. Баканов В.М - 31 стр.

UptoLike

Составители: 

- 31 -
две: декартова N-мерная решетка (с цикличностью и без) и ориентирован-
ный граф. Существуют функции для создания и тестирования нумераций
(
MPI_Cart_xxx
,
MPI_Graph_xxx, MPI_Topo_test
) и для преобразования номеров
из одной системы в другую. Этот механизм чисто логический и не связан с
аппаратной топологией; при его применении автоматизируется пересчет ад-
ресов ветвей (например, при вычислении матриц иногда выгодно использо-
вать картезианскую систему координат, где координаты вычислительной
ветви совпадают с координатами вычисляемой ею подматрицы).
int
MPI_Recv(void* buf, int count, MPI_Datatype datatype, int source, int msgtag,
MPI_Comm comm, MPI_Status *status);
buf
- адрес начала буфера приема сообщения (возвращаемое значение)
count
- максимальное число элементов в принимаемом сообщении
datatype
- тип элементов принимаемого сообщения
source
- номер процесса-отправителя
msgtag
- идентификатор принимаемого сообщения
comm
- идентификатор группы
status
- параметры принятого сообщения (возвращаемое значение)
Функция
MPI_Recv
осуществляет прием сообщения с идентификатором
msgtag
от процесса
source
с блокировкой (блокировка гарантирует, что после
возврата из подпрограммы все элементы сообщения приняты и расположены
в буфере
buf
). Число элементов в принимаемом сообщении не должно пре-
восходить значения
count
(если число принятых элементов меньше
count
, то
гарантируется, что в буфере
buf
изменятся только элементы, соответствую-
щие элементам принятого сообщения). Если процесс посылает два сообще-
ния другому процессу и оба эти сообщения соответствуют одному и тому же
вызову
MPI_Recv
, первым будет принято то сообщение, которое было от-
правлено раньше.
Т.о. с помощью пары функций
MPI_Send/MPI_Recv
осуществляется надеж-
ная (но не слишком эффективная) передача данных между процессами. Од-
нако в некоторых случаях (например, когда принимающая сторона ожидает
приема сообщений, но априори не знает длины и типа их) удобно использо-
вать блокирующую функцию
MPI_Probe
, позволяющую определить характе-
ристики сообщения до того, как оно будет помещено в приемный пользова-
тельский буфер (гарантируется, что следующая вызванная функция
MPI_Recv
прочитает именно протестированное
MPI_Probe
сообщение):
int
MPI_Probe( int source, int msgtag, MPI_Comm comm, MPI_Status *status);
source
- номер процесса-отправителя (или
MPI_ANY_SOURCE)
msgtag
- идентификатор ожидаемого сообщения (или
MPI_ANY_TAG
)
comm
- идентификатор группы
                                         - 31 -

две: декартова N-мерная решетка (с цикличностью и без) и ориентирован-
ный граф. Существуют функции для создания и тестирования нумераций
(MPI_Cart_xxx, MPI_Graph_xxx, MPI_Topo_test) и для преобразования номеров
из одной системы в другую. Этот механизм чисто логический и не связан с
аппаратной топологией; при его применении автоматизируется пересчет ад-
ресов ветвей (например, при вычислении матриц иногда выгодно использо-
вать картезианскую систему координат, где координаты вычислительной
ветви совпадают с координатами вычисляемой ею подматрицы).

int
MPI_Recv(void* buf, int count, MPI_Datatype datatype, int source, int msgtag,
         MPI_Comm comm, MPI_Status *status);

  •    buf - адрес начала буфера приема сообщения (возвращаемое значение)
  •    count - максимальное число элементов в принимаемом сообщении
  •    datatype - тип элементов принимаемого сообщения
  •    source - номер процесса-отправителя
  •    msgtag - идентификатор принимаемого сообщения
  •    comm - идентификатор группы
  •    status - параметры принятого сообщения (возвращаемое значение)

  Функция MPI_Recv осуществляет прием сообщения с идентификатором
msgtag от процесса source с блокировкой (блокировка гарантирует, что после
возврата из подпрограммы все элементы сообщения приняты и расположены
в буфере buf). Число элементов в принимаемом сообщении не должно пре-
восходить значения count (если число принятых элементов меньше count, то
гарантируется, что в буфере buf изменятся только элементы, соответствую-
щие элементам принятого сообщения). Если процесс посылает два сообще-
ния другому процессу и оба эти сообщения соответствуют одному и тому же
вызову MPI_Recv, первым будет принято то сообщение, которое было от-
правлено раньше.
  Т.о. с помощью пары функций MPI_Send/MPI_Recv осуществляется надеж-
ная (но не слишком эффективная) передача данных между процессами. Од-
нако в некоторых случаях (например, когда принимающая сторона ожидает
приема сообщений, но априори не знает длины и типа их) удобно использо-
вать блокирующую функцию MPI_Probe, позволяющую определить характе-
ристики сообщения до того, как оно будет помещено в приемный пользова-
тельский буфер (гарантируется, что следующая вызванная функция MPI_Recv
прочитает именно протестированное MPI_Probe сообщение):

int
MPI_Probe( int source, int msgtag, MPI_Comm comm, MPI_Status *status);

   •    source - номер процесса-отправителя (или MPI_ANY_SOURCE)
   •    msgtag - идентификатор ожидаемого сообщения (или MPI_ANY_TAG)
   •    comm - идентификатор группы