Составные объекты в клиентском сеансе MATLAB ® позволяют напрямую обращаться к значениям данных работников. Чаще всего эти переменные присваиваются вspmd заявления. При отображении и использовании Composites напоминают массивы ячеек. Существует два способа создания композитов:
При определении или назначении значений переменным внутри spmd , значения данных хранятся на рабочих.
После spmd эти значения данных доступны на клиенте как Composites. Составные объекты напоминают массивы ячеек и ведут себя аналогично. На клиенте составной элемент имеет один элемент на работника. Например, предположим, что создается параллельный пул из трех локальных работников и выполняется 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Перенос данных из работника в клиент при явном назначении переменной в рабочей области клиента с помощью составного элемента:
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Однако доступ к элементам составного элемента для назначения значений другим составным элементам приводит к передаче данных от работников клиенту, даже если назначение затем передается тому же работнику. В этом случае 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 заявление. При установке элемента составного элемента данные немедленно передаются соответствующему работнику:
for ii = 1:numel(PP) PP{ii} = ii; end