Simultaneously send data to and receive data from another worker
dataReceived = labSendReceive(rcvWkrIdx,srcWkrIdx,dataSent)
dataReceived = labSendReceive(rcvWkrIdx,srcWkrIdx,dataSent,tag)
| Data on the sending worker that is sent to the receiving worker; any MATLAB® data type. |
| Data accepted on the receiving worker. |
|
|
|
|
| Nonnegative integer to identify data. |
dataReceived = labSendReceive(rcvWkrIdx,srcWkrIdx,dataSent)
sends dataSent
to
the worker whose labindex
is rcvWkrIdx
,
and receives dataReceived
from the worker whose labindex
is srcWkrIdx
.
The values for arguments rcvWkrIdx
and srcWkrIdx
must
be scalars. This function is conceptually equivalent to the following
sequence of calls:
labSend(dataSent,rcvWkrIdx); dataReceived = labReceive(srcWkrIdx);
with the important exception that both the sending and receiving
of data happens concurrently. This can eliminate deadlocks that might
otherwise occur if the equivalent call to labSend
would
block.
If rcvWkrIdx
is an empty array, labSendReceive
does
not send data, but only receives. If srcWkrIdx
is
an empty array, labSendReceive
does not receive
data, but only sends.
dataReceived = labSendReceive(rcvWkrIdx,srcWkrIdx,dataSent,tag)
uses
the specified tag for the communication. tag
can
be any integer from 0
to 32767
.
Create a unique set of data on each worker, and transfer each
worker's data one worker to the right (to the next higher labindex
).
First use the magic
function
to create a unique value for the variant array mydata
on
each worker.
mydata = magic(labindex)
Lab 1: mydata = 1 Lab 2: mydata = 1 3 4 2 Lab 3: mydata = 8 1 6 3 5 7 4 9 2
Define the worker on either side, so that each worker will receive data from the worker on its "left," while sending data to the worker on its "right," cycling data from the end worker back to the beginning worker.
rcvWkrIdx = mod(labindex, numlabs) + 1; % one worker to the right srcWkrIdx = mod(labindex - 2, numlabs) + 1; % one worker to the left
Transfer the data, sending each worker's mydata
into
the next worker's otherdata
variable, wrapping
the third worker's data back to the first worker.
otherdata = labSendReceive(rcvWkrIdx,srcWkrIdx,mydata)
Lab 1: otherdata = 8 1 6 3 5 7 4 9 2 Lab 2: otherdata = 1 Lab 3: otherdata = 1 3 4 2
Transfer data to the next worker without wrapping data from the last worker to the first worker.
if labindex < numlabs; rcvWkrIdx = labindex + 1; else rcvWkrIdx = []; end; if labindex > 1; srcWkrIdx = labindex - 1; else srcWkrIdx = []; end; otherdata = labSendReceive(rcvWkrIdx,srcWkrIdx,mydata)
Lab 1: otherdata = [] Lab 2: otherdata = 1 Lab 3: otherdata = 1 3 4 2
labBarrier
| labindex
| labProbe
| labReceive
| labSend
| numlabs