Составные объекты в 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
ans = 8 1 6 3 5 7 4 9 2
MM{2}
ans = 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
HH = Worker 1: No data Worker 2: class = double, size = [4 4] Worker 3: class = double, size = [4 4]
Можно также установить значения Составных элементов от клиента. Это вызывает передачу данных, храня значение на соответствующем рабочем даже при том, что это не выполняется в spmd
оператор:
MM{3} = eye(4);
В этом случае, MM
должен уже существовать как Составной объект, в противном случае MATLAB интерпретирует его как массив ячеек.
Теперь, когда вы действительно вводите spmd
оператор, значение переменной MM
на рабочем 3 как установлен:
spmd if labindex == 3, MM, end end
Worker 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
M = 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
ans = 4×1 cell array {[1]} {[2]} {[3]} {[4]}
spmd AA = AA * 2; % Multiply existing value end AA(:) % Composite
ans = 4×1 cell array {[2]} {[4]} {[6]} {[8]}
clear AA % Clearing in client also clears on workers spmd AA = AA * 2; end % Generates error delete(gcp)
Analyzing and transferring files to the workers ...done. Error detected on workers 2 3 4. Caused by: An UndefinedFunction error was thrown on the workers for 'AA'. This may be because the file containing 'AA' is not accessible on the workers. Specify the required files for this parallel pool using the command: addAttachedFiles(pool, ...). See the documentation for parpool for more details. Unrecognized function or variable 'AA'.
Composite
функция создает Составные объекты, не используя spmd
оператор. Эта сила быть полезным, чтобы предварительно заполнить значения переменных на рабочих перед spmd
оператор начинает выполняться на тех рабочих. Примите, что параллельный пул уже запускается:
PP = Composite()
По умолчанию это создает Составной объект с элементом для каждого рабочего в параллельном пуле. Можно также создать, Составляет композит только на подмножестве рабочих в пуле. Дополнительную информацию см. в Составной странице с описанием. Элементы Составного объекта могут теперь быть установлены, как обычно, на клиенте, или как переменные в spmd
оператор. Когда вы устанавливаете элемент Составного объекта, данные сразу передаются соответствующему рабочему:
for ii = 1:numel(PP) PP{ii} = ii; end