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

Введение в композиты

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

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

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

Создание композитов в операторах spmd

Когда вы задаете или присваиваете значения переменным внутри 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 блоки.

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

Создайте композиты Outside spmd Операторов

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

PP = Composite()

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

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