Распределите массивы и запущенный 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-by-4, R, случайных чисел на каждом рабочем в пуле.

Составляет композит

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

Продолжая пример сверху, на клиенте, Составной объект 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, и Составляет композит, смотрите Распределенные Массивы.