exponenta event banner

spmd

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

Синтаксис

spmd
    statements
end

Описание

пример

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

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

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

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

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

Примечание

Использовать parfevalOnAll вместо parfor или spmd если вы хотите использовать clear. Это сохраняет прозрачность рабочей области. См. раздел Обеспечение прозрачности в пакетных циклах или инструкциях 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});

Figure contains 3 axes. Axes 1 contains an object of type image. Axes 2 contains an object of type image. Axes 3 contains an object of type image.

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

delete(gcp);

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

Для определения количества графических процессоров, доступных для использования в MATLAB, используйте gpuDeviceCount функция.

availableGPUs = gpuDeviceCount("available")
availableGPUs = 3

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

parpool('local',availableGPUs);
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 3).

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

spmd
    gpuDevice
end

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

Завершив вычисления, закройте параллельный пул. Вы можете использовать gcp для получения текущего параллельного пула.

delete(gcp('nocreate'));

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

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

[availableGPUs,gpuIndx] = gpuDeviceCount("available")
availableGPUs = 3
gpuIndx = 1×3

     1     2     3

Определите индексы устройств, которые требуется использовать.

useGPUs = [1 3];

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

parpool('local',numel(useGPUs));
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 2).
spmd
    gpuDevice(useGPUs(labindex));
end

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

Завершив вычисления, закройте параллельный пул.

delete(gcp('nocreate'));

Совет

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

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

  • Сведения об ограничениях и ограничениях при использовании spmdсм. раздел Запуск отдельных программ для нескольких наборов данных.

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

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