NAME¶
pvm_psend - Pack and send data in one call.
SYNOPSIS¶
C int info = pvm_psend( int tid, int msgtag, char *buf,
int len, int datatype )
Fortran call pvmfpsend( tid, msgtag, buf, len, datatype,
info )
PARAMETERS¶
- tid
- Integer task identifier of destination process.
- msgtag
- Integer message tag supplied by the user. msgtag should be >= 0.
- buf
- Pointer to a buffer to send.
- len
- Length of buffer (in multiple of data type size).
- datatype
- Type of data to which buf points (see below).
- info
- Integer status code returned by the routine.
DESCRIPTION¶
The routine
pvm_psend takes a pointer to a buffer
buf its length
len and its data type
datatype and sends this data directly to
the PVM task identified by
tid. msgtag is used to label the
content of the message. If pvm_psend is successful,
info will be 0. If
some error occurs then
info will be < 0.
pvm_psend data can be received by pvm_precv, pvm_recv, pvm_trecv, or pvm_nrecv.
The pvm_psend routine is asynchronous. Computation on the sending processor
resumes as soon as the buffer is safe for reuse. This is in contrast to
synchronous communication, during which computation on the sending processor
halts until the matching receive is executed by the receiving processor.
In C the
datatype parameter must be one of the following, depending on
the type of data to be sent: [Version 3.3.0 - This parameter only determines
message length, not data conversion. It only sends raw bytes]
datatype Data Type
PVM_STR string
PVM_BYTE byte
PVM_SHORT short
PVM_INT int
PVM_FLOAT real
PVM_CPLX complex
PVM_DOUBLE double
PVM_DCPLX double complex
PVM_LONG long integer
PVM_USHORT unsigned short int
PVM_UINT unsigned int
PVM_ULONG unsigned long int
In Fortran the same data types specified for pack should be used.
The PVM model guarantees the following about message order. If task 1 sends
message A to task 2, then task 1 sends message B to task 2, message A will
arrive at task 2 before message B. Moreover, if both messages arrive before
task 2 does a receive, then a wildcard receive will always return message A.
pvm_psend does not affect the state of the current outgoing message buffer
(created by pvm_initsend and used by pvm_send).
WARNINGS¶
In some versions of PVM (CM5, I860 and PGON), messages sent using pvm_psend must
be received only by pvm_precv, likewise those sent with pvm_send must be
received by pvm_recv, pvm_nrecv or pvm_trecv. pvm_psend is not compatible with
pvm_recv (nor pvm_send with pvm_precv). In addition, pvm_probe is not
interoperable with pvm_psend.
This problem occurs because nonstandard message headers are used for efficiency
in the pvm_psend function. In the generic Unix version of PVM, the calls are
fully interoperable.
The message tag space is shared between pvm_send and pvm_psend, so you must be
careful to avoid selecting the wrong message (for example by using a wildcard
to match the message).
EXAMPLES¶
C:
info = pvm_psend( tid, msgtag, array, 1000, PVM_FLOAT );
Fortran:
CALL PVMFPSEND( TID, MSGTAG, BUF, CNT, REAL4, INFO )
ERRORS¶
These error conditions can be returned by
pvm_psend
- PvmBadParam
- giving an invalid tid, msgtag, or datatype.
- PvmSysErr
- pvmd not responding.
SEE ALSO¶
pvm_precv(3PVM), pvm_send(3PVM)