The following functions allow you to send messages. Our model is that the data starts out in the message buffer, and from there gets transferred ``into the network''. The data stays ``in the network'' for a while, and eventually appears on the target processor. Using that model, each of these send-functions is a device that transfers data into the network. None of these functions wait for the data to be delivered.
On some machines, the network accepts data rather slowly. We don't want the process to sit idle, waiting for the network to accept the data. So, we provide several variations on each send function:
void CmiSyncSend(unsigned int destPE, unsigned int size, void *msg)
Sends msg of size size bytes to processor
destPE. When it returns, you may reuse the message buffer.
void CmiSyncNodeSend(unsigned int destNode, unsigned int size, void *msg)
Sends msg of size size bytes to node
destNode. When it returns, you may reuse the message buffer.
void CmiSyncSendAndFree(unsigned int destPE, unsigned int size, void *msg)
Sends msg of size size bytes to processor
destPE. When it returns, the message buffer has been freed
using CmiFree.
void CmiSyncNodeSendAndFree(unsigned int destNode, unsigned int size, void *msg)
Sends msg of size size bytes to node
destNode. When it returns, the message buffer has been freed
using CmiFree.
CmiCommHandle CmiAsyncSend(unsigned int destPE, unsigned int size, void *msg)
Sends msg of size size bytes to processor
destPE. It returns a communication handle which can be
tested using CmiAsyncMsgSent: when this returns true, you may reuse
the message buffer. If the returned communication handle is 0, message buffer
can be reused immediately, thus saving a call to CmiAsyncMsgSent.
CmiCommHandle CmiAsyncNodeSend(unsigned int destNode, unsigned int size, void *msg)
Sends msg of size size bytes to node
destNode. It returns a communication handle which can be
tested using CmiAsyncMsgSent: when this returns true, you may reuse
the message buffer. If the returned communication handle is 0, message buffer
can be reused immediately, thus saving a call to CmiAsyncMsgSent.
void CmiSyncVectorSend(int destPE, int len, int sizes[], char *msgComps[])
Concatenates several pieces of data and sends them to processor
destPE. The data consists of len pieces residing in
different areas of memory, which are logically concatenated. The
msgComps array contains pointers to the pieces; the size of
msgComps[i] is taken from sizes[i].
When it returns, sizes, msgComps and the message
components specified in msgComps can be immediately reused.
void CmiSyncVectorSendAndFree(int destPE, int len, int sizes[], char *msgComps[])
Concatenates several pieces of data and sends them to processor
destPE. The data consists of len pieces residing in
different areas of memory, which are logically concatenated. The
msgComps array contains pointers to the pieces; the size of
msgComps[i] is taken from sizes[i].
The message components specified in msgComps are CmiFreed
by this function therefore, they should be dynamically
allocated using CmiAlloc. However, the sizes and
msgComps array themselves are not freed.
CmiCommHandle CmiAsyncVectorSend(int destPE, int len, int sizes[], char *msgComps[])
Concatenates several pieces of data and sends them to processor
destPE. The data consists of len pieces residing in
different areas of memory, which are logically concatenated. The
msgComps array contains pointers to the pieces; the size of
msgComps[i] is taken from sizes[i].
The individual pieces of data as well as the arrays sizes and
msgComps should not be overwritten or freed before the
communication is complete. This function returns a communication
handle which can be tested using CmiAsyncMsgSent: when this returns
true, the input parameters can be reused. If the returned communication
handle is 0, message buffer
can be reused immediately, thus saving a call to CmiAsyncMsgSent.
int CmiAsyncMsgSent(CmiCommHandle handle)
Returns true if the communication specified by the given
CmiCommHandle has proceeded to the point where the message buffer can
be reused.
void CmiReleaseCommHandle(CmiCommHandle handle)
Releases the communication handle handle and
associated resources. It does not free the message buffer.
void CmiMultipleSend(unsigned int destPE, int len, int sizes[], char
*msgComps[])
This function allows the user to send
multiple messages that may be
destined for the SAME PE in one go. This is more efficient than sending
each message to the destination node separately. This function assumes
that the handlers that are to receive this message have already been set.
If this is not done, the behavior of the function is undefined.
In the function, The destPE parameter identifies the destination processor. The len argument identifies the number of messages that are to be sent in one go. The sizes[] array is an array of sizes of each of these messages. The msgComps[] array is the array of the messages. The indexing in each array is from 0 to len - 1. (Note: Before calling this function, the program needs to initialise the system to be able to provide this service. This is done by calling the function CmiInitMultipleSendRoutine. Unless this function is called, the system will not be able to provide the service to the user.)
November 23, 2009
Converse Homepage
Charm Homepage