Составные объекты в MATLAB® сеанс клиента позволяет вам непосредственно получить доступ к значениям данных о работниках. Чаще всего вы присваивали эти переменные внутри spmd операторы. По своему отображению и использованию Composites напоминают массивы ячеек. Существует два способа создать Composites:
Когда вы задаете или присваиваете значения переменным внутри spmd оператор, значения данных хранятся у работников.
После spmd оператор, эти значения данных доступны на клиенте как Composites. Составные объекты напоминают массивы ячеек и ведут себя аналогично. На клиенте Composite имеет по одному элементу на каждого работника. Например, предположим, что вы создаете параллельный пул из трех локальных работников и запускаете 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 2MM{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Передача данных от работника к клиенту при явном назначении переменной в рабочей рабочей области клиента с помощью элемента Composite:
M = MM{1} % Transfer data from worker 1 to variable M on the client 8 1 6
3 5 7
4 9 2Назначение всего композита другому составу не приводит к переносу данных. Вместо этого клиент просто дублирует Composite как ссылку на соответствующие данные, хранящиеся на рабочих местах:
NN = MM % Set entire Composite equal to another, without transferОднако доступ к элементам Composite для назначения значений другим Composites приводит к переносу данных от работников к клиенту, даже если назначение затем переходит к тому же работнику. В этом случае 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()
По умолчанию это создает композит с элементом для каждого работника в параллельном пуле. Можно также создать композиты только для подмножества работников пула. Для получения дополнительной информации см. Страницу с описанием Composite. Теперь элементы Composite могут быть установлены как обычно на клиенте или как переменные внутри spmd оператор. При установке элемента массива Composite данные немедленно передаются соответствующему работнику:
for ii = 1:numel(PP) PP{ii} = ii; end