Одновременно отправляйте и получайте данные от другого работника
dataReceived = labSendReceive(rcvWkrIdx,srcWkrIdx,dataSent)
dataReceived = labSendReceive(rcvWkrIdx,srcWkrIdx,dataSent,tag)
| Данные о работнике-отправителе, который отправляется получающему работнику; любой MATLAB® тип данных. |
| Данные, принятые на получающем работнике. |
|
|
|
|
| Неотрицательное целое число для идентификации данных. |
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
labBarrier
| labindex
| labProbe
| labReceive
| labSend
| numlabs