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. Предопределенные
типы данных на Fortran такие же, как и для pvmfpack(). На
C, аргумент type может иметь любое из следующих значений.
PVM_STR
PVM_FLOAT PVM_BYTE
ПВМ поддерживает несколько методов приема задачей сообщений. В ПВМ
нет точного соответствия функций, например, применение 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_recv может заблокироваться навечно.
Для избежания такой ситуации, пользователь может захотеть "прекратить"
ожидание после истечения фиксированного временного отрезка. Подпрограмма
pvm_trecv() предоставляет пользователю возможность указать
период тайм-аута. Если этот период очень велик, то pvm_trecv()
действует подобно pvm_recv. Если же период тайм-аута установлен
в ноль, то
pvm_trecv() действует подобно pvm_nrecv.
Так, pvm_trecv "заполняет пробел" между функциями
блокирующего и неблокирующего приема.
Подпрограмма pvm_bufinfo() возвращает msgtag, TID
источника и длину в байтах сообщения, идентифицированного с помощью
bufid. Она может примеряться для установления метки и источника
сообщений, которые были приняты с использованием специальных символов.
int info = pvm_bufinfo( int bufid, int *bytes, int *msgtag, int *tid)
Подпрограмма pvm_precv() сочетает в себе функции блокирующего
приема и распаковки буфера приема. Она не возвращает bufid.
Вместо него, она возвращает действительные значения TID,
msgtag и cnt.
int info = pvm_precv( int tid, int msgtag, void *vp, int cnt,
Подпрограмма pvm_recvf() модифицирует контекст работы принимающих
функций и может быть использована для "расширения" ПВМ. Используемый
по умолчанию контекст приема заключается в соответствии источника
и тега сообщения. Он может быть модифицирован для любой определяемой
пользователем функции сравнения. Подпрограммы, соответствующей pvm_recvf()
с интерфейсом на Fortran - нет.
Знаете ли Вы, что идеализация - это мысленное конструирование представлений об объектах, не существующих или неосуществимых в действительности, но таких, для которых существуют прообразы в реальном мире.