Main Content

labSendReceive

別のワーカーとの間でデータの送信と受信を同時に行う

構文

dataReceived = labSendReceive(rcvWkrIdx,srcWkrIdx,dataSent)
dataReceived = labSendReceive(rcvWkrIdx,srcWkrIdx,dataSent,tag)

引数

dataSent

受信側ワーカーに送信する送信側ワーカーの、任意の MATLAB® データ型のデータ

dataReceived

受信側ワーカーで受信するデータ

rcvWkrIdx

データの送信先となる受信側ワーカーの labindex

srcWkrIdx

データの送信元となる送信側ワーカーの labindex

tag

データを特定する非負の整数

説明

dataReceived = labSendReceive(rcvWkrIdx,srcWkrIdx,dataSent) は、labindexrcvWkrIdx であるワーカーに dataSent を送信し、labindexsrcWkrIdx であるワーカーから dataReceived を受信します。引数 rcvWkrIdx および srcWkrIdx の値はスカラーでなければなりません。この関数は次の一連の呼び出しと概念上等価です。

labSend(dataSent,rcvWkrIdx);
dataReceived = labReceive(srcWkrIdx);

ただし、重要な違いとして、この関数ではデータの送信と受信が同時に実行されます。これにより、labSend への等価な呼び出しがブロックした場合に、発生する可能性があるデッドロックを防止できます。

rcvWkrIdx が空の配列の場合、labSendReceive はデータを送信せずに受信だけを行います。srcWkrIdx が空の配列の場合、labSendReceive はデータを受信せずに送信だけを行います。

dataReceived = labSendReceive(rcvWkrIdx,srcWkrIdx,dataSent,tag) では通信に指定されたタグを使用します。tag032767 の任意の整数とすることができます。

各ワーカーに固有のデータセットを作成し、各ワーカーのデータを右側のワーカー (labindex の昇順で次のワーカー) に転送します。

まず、関数 magic を使用して、各ワーカーでバリアント配列 mydata に一意の値を作成します。

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

各ワーカーが "左側" のワーカーからデータを受信すると共に "右側" のワーカーにデータを送信して、最後のワーカーのデータが最初のワーカーに循環するよう、両側のワーカーを定義します。

rcvWkrIdx = mod(labindex, numlabs) + 1; % one worker to the right
srcWkrIdx = mod(labindex - 2, numlabs) + 1; % one worker to the left

各ワーカーの mydata を次のワーカーの変数 otherdata に送信し、3 番目のワーカーのデータを最初のワーカーに折り返して、データを転送します。

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

最後のワーカーのデータを最初のワーカーに折り返さずに、データを次のワーカーに転送します。

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
R2006b で導入