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) отправляет dataSent рабочему, labindex которого является rcvWkrIdx и получает dataReceived от рабочего, labindex которого является srcWkrIdx. Значения для аргументов rcvWkrIdx и srcWkrIdx должны быть скалярами. Эта функция концептуально эквивалентна следующей последовательности вызовов:

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

с важным исключением, что и отправка и получение данных происходят одновременно. Это может устранить мертвые блокировки, которые могут в противном случае произойти, если бы эквивалентный вызов labSend блокировался бы.

Если rcvWkrIdx является пустым массивом, labSendReceive не отправляет данные, но только получает. Если srcWkrIdx является пустым массивом, labSendReceive не получает данные, но только отправляет.

dataReceived = labSendReceive(rcvWkrIdx,srcWkrIdx,dataSent,tag) использует заданный тег для коммуникации. tag может быть любым целым числом от 0 до 32767.

Примеры

Создайте уникальный набор данных по каждому рабочему и передайте данные каждого рабочего один рабочий направо (к следующему более высокому 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 следующего рабочего, перенеся данные третьего рабочего назад первому рабочему.

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