int info = pvm_mcast( int *tids, int ntask, int msgtag)
call pvmfmcast( ntask, tids, msgtag, info)
Подпрограмма pvm_send() помечает сообщение целочисленным идентификатором
msgtag и передает его непосредственно процессу TID.
Подпрограмма pvm_mcast() помечает сообщение целочисленным идентификатором
msgtag и широковещательно передает это сообщение всем задачам,
указанным в целочисленном массиве tids (исключая себя). Массив
tids имеет длину ntask.
int info = pvm_psend( int tid, int msgtag, void *vp,
int cnt, int type)
call pvmfpsend( tid, msgtag, xp, cnt, type, info)
Подпрограмма pvm_psend() упаковывает и посылает массив данных
указанного типа задаче, идентифицированной TID. Предопределенные
типы данных на Фортране такие же, как и для pvmfpack(). В языке
C аргумент type может иметь любое из следующих значений:
PVM_STR
PVM_FLOAT
PVM_BYTE
PVM_CPLX
PVM_SHORT
PVM_DOUBLE
PVM_INT
PVM_DCPLX
PVM_LONG
PVM_UINT
PVM_USHORT
PVM_ULONG
PVM поддерживает несколько методов приема сообщений в задаче. В PVM
нет точного соответствия функций, например, применение pvm_send
не обязательно требует применения pvm_recv. Каждая из следующих
подпрограмм может быть вызвана для любого из поступающих сообщений
вне зависимости от того, как оно было передано (или передано широковещательно).
int bufid = pvm_recv( int tid, int msgtag)
call pvmfrecv( tid, msgtag, bufid)
Эта подпрограмма блокирующего приема будет ожидать до тех пор, пока
от задачи с TID не поступит сообщение с меткой msgtag.
Значение -1 в msgtid или TID означает ``все задачи''
(специальный символ). После поступления она помещает сообщение в новый создаваемый активный
буфер приема. Предыдущий активный буфер приема очищается,
если он не был сохранен вызовом pvm_setrbuf().
int bufid = pvm_nrecv(int tid, int msgtag)
call pvmfnrecv( tid, msgtag, bufid)
Если запрашиваемое сообщение не прибыло, то неблокирующий прием pvm_nrecv()
при завершении вернет код, равный 0. Эта подпрограмма может вызываться
сколько угодно раз для определенного сообщения - с целью проверки
его прибытия - в промежутках выполнения работы программы. Если же
возможной в данной ситуации работы не осталось, для того же сообщения
можно воспользоваться блокирующим приемом pvm_recv(). Если
сообщение с меткой msgtag поступило от задачи с TID,
pvm_nrecv() помещает это сообщение в новый активный буфер
(который она создает) и возвращает идентификатор данного буфера. Предыдущий
активный буфер приема очищается, если он не был сохранен вызовом pvm_setrbuf().
Значение -1 в msgtid или TID означает ``все задачи''
(специальный символ).
int bufid = pvm_probe( int tid, int msgtag)
call pvmfprobe( tid, msgtag, bufid)
Если запрашиваемое сообщение не прибыло, то pvm_probe()
возвращает bufid, равный 0. В противном случае она возвращает
bufid сообщения, но не ``принимает'' его. Эта подпрограмма
может вызываться сколько угодно раз для определенного сообщения -
с целью проверки его прибытия - в промежутках выполнения работы.
Дополнительно может быть вызвана pvmbufinfo() с возвращенным
bufid - для получения информации о сообщении перед его непосредственным
приемом.
int bufid = pvm_trecv( int tid, int msgtag,
struct timeval *tmout)
call pvmftrecv( tid, msgtag, sec, usec, bufid)
PVM также поддерживает версию приема с тайм-аутом. Рассмотрим случай,
при котором сообщение не прибывает никогда (из-за ошибки или
сбоя): подпрограмма pvm_recv может заблокироваться навечно.
Для избежания такой ситуации пользователь может захотеть ``прекратить''
ожидание после истечения фиксированного временного отрезка. Подпрограмма
pvm_trecv() предоставляет пользователю возможность указать
период тайм-аута. Если этот период очень велик, то pvm_trecv()
действует подобно pvm_recv. Если же период тайм-аута установлен
в ноль, то pvm_trecv() действует подобно pvm_nrecv.
Так, pvm_trecv ``заполняет пробел'' между функциями
блокирующего и неблокирующего приема.
Подпрограмма pvm_bufinfo() возвращает msgtag, TID
источника и длину в байтах сообщения, идентифицированного с помощью
bufid. Она может применяться для установления метки и источника
сообщений, которые были приняты с использованием специальных символов.
Подпрограмма pvm_precv() сочетает в себе функции блокирующего
приема и распаковки буфера приема. Она не возвращает bufid.
Вместо него она возвращает действительные значения TID,
msgtag и cnt.
int info = pvm_precv( int tid, int msgtag, void *vp,
Подпрограмма pvm_recvf() модифицирует контекст работы принимающих
функций и может быть использована для ``расширения'' PVM. Используемый
по умолчанию контекст приема заключается в соответствии источника
и тега сообщения. Он может быть модифицирован для любой определяемой
пользователем функции сравнения. Подпрограммы, соответствующей pvm_recvf(),
с интерфейсом на Фортране - нет.