shmem_get() copies nlong 32-bit words from the remote
buffer source on node node to the local buffer target.
It is an individual operation. Note that:
shmem_get()ing it, target will wind up with some
combination of old and new data).
shmem_get(), but does not wait for
the remote data to arrive before returning. The advantage is that this
allows multiple get operations (or a get operation and any code that
does not require the use of target) to proceed concurrently. As
soon as the data in target becomes valid, the value pointed to by
*pcount is incremented.
shmem_cget() is generally used in conjunction with
shmem_cwait() and is an individual function.
shmem_put() copies nlong 32-bit words from the local
buffer source to the remote buffer target on node
node. It is an individual operation. Note that:
shmem_put() returns.
shmem_put() different data
to the same region of memory on a third node, the third node will wind
up with some combination of the other nodes' message).
shmem_swap() atomically sets the value at address target on
node node to swap_value and returns the value previously
stored there. This function is an individual operation.
shmem_broadcast() is a collective operation which broadcasts
nlong 32-bit words from the root node (PE_root) to the
other nodes in the active set. Recall that the active set is defined by
the start node (PE_start), the number of nodes (PE_size),
and the stride (logPE_stride). The stride is specified as log,
base 2, of the actual stride. The value of PE_root is relative to
the active set, so to broadcast from the first node in the active set
(PE_start), PE_root should be zero, not PE_start.
Note that source is not copied to target on the root node. Also, all nodes in the active set must call the function with the same arguments, including the address for the target and pSync buffers. Furthermore, only the processors in the active set should call the function.
pSync is a synchronization buffer and it must be initialized
before it is first used. It should be of size
_SHMEM_BCAST_SYNC_SIZE, and each element must be set to
_SHMEM_SYNC_VALUE. Because it must be initialized before any
node might try to access it, there should be a barrier between when it
is set and when any nodes might use it for the first time:
static long pSync[_SHMEM_BCAST_SYNC_SIZE];
.
.
.
for (i=0; i<_SHMEM_BCAST_SYNC_SIZE; i++)
pSync[i] = _SHMEM_SYNC_VALUE;
barrier();
shmem_broadcast (..., pSync);
Here is an example use of active sets, where node 1 broadcasts a value to all of the odd nodes:
shmem_broadcast(target, source, nlong, 0, 1, 1, numnodes/2, pSync);
Go to the first, previous, next, last section, table of contents.