C int info = pvm_psend( int tid, int msgtag, char *buf,
int len, int datatype )
Fortran call pvmfpsend( tid, msgtag, buf, len, datatype,
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).
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).
C: info = pvm_psend( tid, msgtag, array, 1000, PVM_FLOAT ); Fortran: CALL PVMFPSEND( TID, MSGTAG, BUF, CNT, REAL4, INFO )