sPMD

Выполните код параллельно на рабочих параллельного пула

Синтаксис

spmd
    statements
end

Описание

пример

spmd, statements, end задает оператор spmd на одной строке. MATLAB® выполняет тело spmd, обозначенное statements на нескольких работниках MATLAB одновременно. Оператор spmd может использоваться, только если у вас есть Parallel Computing Toolbox™. Чтобы выполнить операторы параллельно, необходимо сначала создать пул работников MATLAB, использующих parpool, или иметь параллельные настройки, позволяют автоматический запуск пула.

В теле оператора spmd у каждого работника MATLAB есть уникальное значение labindex, в то время как numlabs обозначает общее количество рабочих, выполняющих блок параллельно. В теле оператора spmd коммуникационные функции для передачи заданий (таких как labSend и labReceive) могут передать данные между рабочими.

Значения, возвращающиеся из тела оператора spmd, преобразованы в объекты Composite на клиенте MATLAB. Составной объект содержит ссылки на значения, сохраненные на удаленных работниках MATLAB, и те значения могут быть получены, использовав индексацию массива ячеек. Фактические данные по рабочим остаются доступными на рабочих для последующего выполнения spmd, пока Составной объект существует на клиенте, и параллельный пул остается открытым.

По умолчанию MATLAB использует всех рабочих в пуле. Когда не будет никакого активного пула, MATLAB будет создавать пул и использовать всех рабочих от того пула. Если ваши настройки не позволяют автоматическое создание пула, MATLAB выполняет тело блока локально и создает Составные объекты по мере необходимости. Вы не можете выполнить блок spmd, если какой-либо рабочий занят, выполняя запрос parfeval, если вы не используете spmd(0).

Для получения дополнительной информации о spmd и Составных объектах, смотрите, Распределяют Массивы и Выполнение SPMD.

Примечание

Используйте parfevalOnAll вместо parfor или spmd, если вы хотите использовать clear. Это сохраняет прозрачность рабочей области. Смотрите Гарантируют Прозрачность в циклах parfor или spmd Операторах.

пример

spmd(n), statements, end n использования, чтобы задать точное количество работников MATLAB, чтобы оценить statements, при условии, что рабочие n доступны от параллельного пула. Если существует недостаточно доступных рабочих, ошибка выдана. Если n является нулем, MATLAB выполняет тело блока локально и создает Составные объекты, то же самое, как будто нет никакого доступного пула.

пример

spmd(m,n), statements, end использует минимум m и максимум рабочих n, чтобы оценить statements. Если существует недостаточно доступных рабочих, ошибка выдана. m может быть нулем, который позволяет блоку запускаться локально, если никакие рабочие не доступны.

Примеры

свернуть все

Создайте параллельный пул и выполните простое вычисление в параллели с помощью spmd. MATLAB выполняет код в spmd на всех рабочих в параллельном пуле.

parpool(3);
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 3).
spmd
  q = magic(labindex + 2);
end

Постройте график результатов.

figure
subplot(1,3,1), imagesc(q{1});
subplot(1,3,2), imagesc(q{2});
subplot(1,3,3), imagesc(q{3});

По окончании с вычислениями, можно удалить текущий параллельный пул.

delete(gcp);

Если у вас есть доступ к нескольким графическим процессорам, можно выполнить вычисления на нескольких графических процессорах в параллели с помощью параллельного пула.

Запустите параллельный пул со стольких же рабочих сколько графические процессоры. Чтобы определить количество доступных графических процессоров, используйте функцию gpuDeviceCount. По умолчанию MATLAB присваивает различный графический процессор каждому рабочему для лучшей производительности.

parpool('local',gpuDeviceCount);

Чтобы идентифицировать, который использует графический процессор каждый рабочий, вызовите gpuDevice в блоке spmd. Блок spmd запускает gpuDevice на каждом рабочем.

spmd
    gpuDevice
end

Используйте функции языка параллельного программирования, такие как parfor или parfeval, чтобы распределить ваши вычисления рабочим в параллельном пуле. Если вы используете включенные функции gpuArray в своих вычислениях, эти функции работают на графическом процессоре рабочего. Для получения дополнительной информации смотрите функции MATLAB Выполнения на графическом процессоре. Для примера смотрите функции MATLAB Выполнения на Нескольких графических процессорах.

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

delete(gcp('nocreate'));

Если вы хотите использовать различный выбор графических процессоров, можно использовать gpuDevice, чтобы выбрать конкретный графический процессор на каждом рабочем. Задайте массив, например, gpuIndices, который содержит индексы графических процессоров, чтобы активироваться на каждом рабочем. Затем запустите параллельный пул со стольких же рабочих сколько графические процессоры, чтобы выбрать, и использовать блок spmd, чтобы запустить gpuDevice на каждом рабочем. Функция labindex идентифицирует каждого рабочего. Используйте эту функцию, чтобы сопоставить рабочего с индексом графического процессора.

gpuIndices = [1 3];
parpool(numel(gpuIndices));
spmd
    gpuDevice(gpuIndices(labindex));
end

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

Советы

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

  • Если свойство AutoAttachFiles в кластерном профиле для параллельного пула установлено в true, MATLAB выполняет анализ блока spmd, чтобы определить, какие файлы кода необходимы для его выполнения, то автоматически присоединяет те файлы к параллельному заданию пула так, чтобы код был доступен рабочим.

  • Для получения информации об ограничениях и ограничениях при использовании spmd, смотрите Выполнение Одна Программы на Нескольких Наборах данных.

Смотрите также

| | | | | |

Представленный в R2008b