Рабочие в параллельном пуле взаимодействуют друг с другом, поэтому можно распределить массив между рабочими. Каждый рабочий процесс содержит часть массива, и всем рабочим известно, какой фрагмент массива имеет каждый рабочий процесс.
Используйте 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
) позволяет вам задать блок кода, который запускается параллельно для всех работников в параллельном пуле. The 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 и т.д.
Существует две формы индексации Composite, сопоставимые с индексацией массива ячеек:
AA{n}
возвращает значения AA
от рабочего n
.
AA(n)
возвращает массив ячеек из содержимого AA
от рабочего n
.
Хотя данные о работниках из одного spmd
сохраняются блок в другой, пока параллельный пул остается открытым, данные не сохраняются от одного образца параллельного пула к другому. То есть, если пул удаляется и создается новый, все данные из первого пула теряются.
Для получения дополнительной информации об использовании распределенных массивов, spmd
, и Composites, см. «Распределенные массивы».