Доступ к переменным рабочего с составными объектами

Введение в составные объекты

Составные объекты в MATLAB® клиентский сеанс позволил вам непосредственно значения данных доступа на рабочих. Чаще всего вы присваивали эти переменные в spmd операторы. В их отображении и использовании, Составляет композит, напоминают массивы ячеек. Существует два способа создать, Составляет композит:

  • Используйте Composite функция на клиенте. Значения, присвоенные Составным элементам, хранятся на рабочих.

  • Задайте переменные на рабочих в spmd оператор. После spmd оператор, сохраненные значения доступны на клиенте, как Составляет композит.

Создайте Составляет композит в 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 блоки.

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

Создайте Составляет Снаружи spmd Операторы

Composite функция создает Составные объекты, не используя spmd оператор. Эта сила быть полезным, чтобы предварительно заполнить значения переменных на рабочих перед spmd оператор начинает выполняться на тех рабочих. Примите, что параллельный пул уже запускается:

PP = Composite()

По умолчанию это создает Составной объект с элементом для каждого рабочего в параллельном пуле. Можно также создать, Составляет композит только на подмножестве рабочих в пуле. Дополнительную информацию см. в Составной странице с описанием. Элементы Составного объекта могут теперь быть установлены, как обычно, на клиенте, или как переменные в spmd оператор. Когда вы устанавливаете элемент Составного объекта, данные сразу передаются соответствующему рабочему:

for ii = 1:numel(PP)
    PP{ii} = ii; 
end