Распределите массивы и запустите 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) позволяет вам задать блок кода, который запускается параллельно для всех работников в параллельном пуле. 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, см. «Распределенные массивы».