Одновременно отправьте данные в и получите данные от другого рабочего
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
| labProbe
| labReceive
| labSend
| labindex
| numlabs