spmd

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

Синтаксис

spmd
    statements
end

Описание

пример

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

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

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

По умолчанию 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 выполняет тело блока локально и создает объекты Composite, так же как если бы пул не был доступен.

пример

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 блок. The spmd блок запускается gpuDevice на каждом работнике.

spmd
    gpuDevice
end

Используйте функции параллельного языка, такие как parfor или parfeval, чтобы распределить ваши расчеты среди работников в параллельном пуле. Если вы используете gpuArray активизированные функции в ваших расчетах, эти функции выполняются на графическом процессоре работника. Для получения дополнительной информации смотрите Запуск функций 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 чтобы связать каждый рабочий процесс с одним из используемых графических процессоров, используя индекс устройства. The 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