exponenta event banner

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

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

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

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

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

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

При определении или назначении значений переменным внутри 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     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

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

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

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

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