exponenta event banner

Распределение массивов и запуск SPMD

Распределенные массивы

Работники в параллельном пуле взаимодействуют друг с другом, что позволяет распределить массив между работниками. Каждый работник содержит часть массива, и все работники знают, какая часть массива есть у каждого работника.

Используйте distributed для распределения массива между работниками:

M = magic(4) % a 4-by-4 magic square in the client workspace
MM = distributed(M)

Сейчас MM - распределенный массив, эквивалентный Mи вы можете манипулировать его элементами или обращаться к ним так же, как и к любому другому массиву.

M2 = 2*MM;  % M2 is also distributed, calculation performed on workers
x = M2(1,1) % x on the client is set to first element of M2

Несколько данных одной программы (spmd)

Одна программа содержит несколько данных (spmd) позволяет определить блок кода, который выполняется параллельно на всех рабочих в параллельном пуле. spmd блок может выполняться для некоторых или всех работников в пуле.

spmd     % By default creates pool and uses all workers
    R = rand(4);
end

Этот код создает отдельную матрицу 4 на 4, R, случайных чисел на каждого работника в пуле.

Соединения

После spmd в клиентском контексте значения из блока доступны, даже если данные фактически хранятся на рабочих. На клиенте эти переменные называются составными объектами. Каждый элемент композита является символом, ссылающимся на значение (данные) работника в пуле. Обратите внимание, что, поскольку переменная может быть определена не для каждого работника, составной элемент может иметь неопределенные элементы.

Продолжая пример сверху, на клиенте, Composite R имеет один элемент для каждого работника:

X = R{3};  % Set X to the value of R from worker 3.

Приведенная выше строка извлекает данные из работника 3 для назначения значения X. Следующий код отправляет данные работнику 3:

X = X + 2;
R{3} = X; % Send the value of X from the client to worker 3.

Если параллельный пул остается открытым между spmd используются инструкции и одни и те же работники, данные о каждом работнике сохраняются из одного spmd заявление другому.

spmd
    R = R + labindex  % Use values of R from previous spmd.
end

Типичное использование для spmd это выполнение одного и того же кода для нескольких работников, каждый из которых получает доступ к различному набору данных. Например:

spmd
    INP = load(['somedatafile' num2str(labindex) '.mat']);
    RES = somefun(INP)
end

Затем значения RES на работников доступны с клиента как RES{1} от работника 1, RES{2} от работника 2 и т.д.

Существует две формы индексирования композита, сравнимые с индексированием массива ячеек:

  • AA{n} возвращает значения AA от работника n.

  • AA(n) возвращает массив ячеек содержимого AA от работника n.

Хотя данные сохраняются на работников от одного spmd если параллельный пул остается открытым, данные из одного экземпляра параллельного пула в другой не сохраняются. То есть, если пул удален и создан новый, все данные из первого пула теряются.

Дополнительные сведения об использовании распределенных массивов см. в разделе spmdи композитные материалы см. в разделе Распределенные массивы.