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