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

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

Составные объекты на клиентском сеансе 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
     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

Передачи данных от рабочего клиенту, когда вы явным образом присваиваете переменную в клиентской рабочей области с помощью Составного элемента:

M = MM{1} % Transfer data from worker 1 to variable M on the client
     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
    [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)

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

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

PP = Composite()

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

for ii = 1:numel(PP)
    PP{ii} = ii; 
end
Для просмотра документации необходимо авторизоваться на сайте