Составные объекты на клиентском сеансе MATLAB® позволяют вам непосредственно значения данных доступа на рабочих. Чаще всего вы присваивали эти переменные в операторах spmd
. В их отображении и использовании, Составляет композит, напоминают массивы ячеек. Существует два способа создать, Составляет композит:
Когда вы задаете или присваиваете значения переменным в операторе spmd
, значения данных хранятся на рабочих.
После оператора spmd
те значения данных доступны на клиенте, как Составляет композит. Составные объекты напоминают массивы ячеек и ведут себя так же. На клиенте Составной объект имеет один элемент на рабочего. Например, предположите, что вы создаете параллельный пул трех локальных рабочих и запускаете оператор spmd
на том пуле:
parpool('local',3) spmd % Uses all 3 workers MM = magic(labindex+2); % MM is a variable on each worker end MM{1} % In the client, MM is a Composite with one element per worker
8 1 6 3 5 7 4 9 2
MM{2}
16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1
Переменная сила не быть заданным на каждом рабочем. Для рабочих, на которых не задана переменная, соответствующий Составной элемент не имеет никакого значения. Попытка считать тот элемент выдает ошибку.
spmd if labindex > 1 HH = rand(4); end end HH
Lab 1: No data Lab 2: class = double, size = [4 4] Lab 3: class = double, size = [4 4]
Можно также установить значения Составных элементов от клиента. Это вызывает передачу данных, храня значение на соответствующем рабочем даже при том, что это не выполняется в операторе spmd
:
MM{3} = eye(4);
В этом случае MM
должен уже существовать как Составной объект, в противном случае MATLAB интерпретирует его как массив ячеек.
Теперь, когда вы действительно вводите оператор spmd
, значение переменной MM
на рабочем 3 как установлено:
spmd if labindex == 3, MM, end end
Lab 3: MM = 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1
Передачи данных от рабочего клиенту, когда вы явным образом присваиваете переменную в клиентской рабочей области с помощью Составного элемента:
M = MM{1} % Transfer data from worker 1 to variable M on the client
8 1 6 3 5 7 4 9 2
Присвоение целого Составного объекта к другому Составному объекту не вызывает передачу данных. Вместо этого клиент просто копирует Составной объект как ссылку на соответствующие данные, хранимые на рабочих:
NN = MM % Set entire Composite equal to another, without transfer
Однако доступ к элементам Составного объекта, чтобы присвоить значения другим Составным объектам действительно приводит к передаче данных от рабочих клиенту, даже если присвоение затем переходит к тому же рабочему. В этом случае NN
должен уже существовать как Составной объект:
NN{1} = MM{1} % Transfer data to the client and then to worker
По окончании можно удалить пул:
delete(gcp)
Значения, сохраненные на рабочих, сохраняются между операторами spmd
. Это позволяет вам использовать несколько операторов spmd
в последовательности и продолжать использовать те же переменные, заданные в предыдущих блоках spmd
.
Значения сохраняются на рабочих, пока соответствующие Составные объекты не очищены на клиенте, или пока параллельный пул не удален. Следующий пример иллюстрирует продолжительность жизни значения данных с блоками spmd
, с помощью пула четырех рабочих:
parpool('local',4) spmd AA = labindex; % Initial setting end AA(:) % Composite
[1] [2] [3] [4]
spmd AA = AA * 2; % Multiply existing value end AA(:) % Composite
[2] [4] [6] [8]
clear AA % Clearing in client also clears on workers spmd; AA = AA * 2; end % Generates error delete(gcp)
Функция Composite
создает Составные объекты, не используя оператор spmd
. Эта сила быть полезной, чтобы предварительно заполнить значения переменных на рабочих перед оператором spmd
начинает выполняться на тех рабочих. Примите, что параллельный пул уже запускается:
PP = Composite()
По умолчанию это создает Составной объект с элементом для каждого рабочего в параллельном пуле. Можно также создать, Составляет композит только на подмножестве рабочих в пуле. Дополнительную информацию см. в Составной странице с описанием. Элементы Составного объекта могут теперь быть установлены, как обычно, на клиенте, или как переменные в операторе spmd
. Когда вы устанавливаете элемент Составного объекта, данные сразу передаются соответствующему рабочему:
for ii = 1:numel(PP) PP{ii} = ii; end