Запустите одну программы на нескольких наборах данных

Введение

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

Эта глава объясняет некоторые характеристики spmd операторы и Composite объекты.

Когда Использовать spmd

“Одна программа” аспект spmd означает, что идентичный код работает на нескольких рабочих. Вы запускаете одну программу в MATLAB® клиент и те части помеченного как spmd блоки работают на рабочих. Когда блок spmd завершен, ваша программа продолжает запускаться в клиенте.

“Несколько данных” аспект означают это даже при том, что spmd оператор запускает идентичный код по всем рабочим, у каждого рабочего могут быть различные, уникальные данные для того кода. Таким образом, несколько наборов данных могут быть вмещены несколькими рабочими.

Типовые приложения, подходящие для spmd те, которые требуют рабочего одновременного осуществления программы на нескольких наборах данных, когда коммуникация или синхронизация требуются между рабочими. Некоторые обычные случаи:

  • Программы, которые занимают много времени, чтобы выполниться — spmd позволяет нескольким рабочим вычислить решения одновременно.

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

Для получения дополнительной информации смотрите, Выбирают Between spmd, parfor, и parfeval.

Задайте spmd Оператор

Общая форма spmd оператор:

spmd
    <statements>
end

Примечание

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

Блок кода представлен <statements> выполняется параллельно одновременно на всех рабочих в параллельном пуле. Если вы хотите ограничить выполнение только фрагментом этих рабочих, задайте точно сколько рабочих, чтобы работать:

spmd (n)
    <statements>
end

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

Можно указать диапазон для количества рабочих:

spmd (m,n)
    <statements>
end

В этом случае, spmd оператор требует минимума m рабочие, и это использует максимум n рабочие.

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

Например, создайте случайную матрицу на трех рабочих:

spmd (3)
    R = rand(4,4);
end

Примечание

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

В отличие от parfor- цикл, рабочие используются для spmd оператор у каждого есть уникальное значение для labindex. Это позволяет вам задать код, на котором будут работать только определенные рабочие или будет настраивать выполнение, обычно в целях доступа к уникальным данным.

Например, создайте разного размера массивы в зависимости от labindex:

spmd (3)
    if labindex==1 
        R = rand(9,9);
      else
        R = rand(4,4);
    end
end

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

spmd (3)
    labdata = load(['datafile_' num2str(labindex) '.ascii'])
    result = MyFunction(labdata)
end

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

Например, используйте codistributed массив в spmd оператор:

spmd (3)
    RR = rand(30, codistributor());
end

Каждый рабочий имеет 30 10 сегмент codistributed массива RR. Для получения дополнительной информации о codistributed массивах, смотрите Работу с Массивами Codistributed.

Отображение Вывода

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

Путь MATLAB

Все рабочие, выполняющие spmd оператор должен иметь тот же путь поиска файлов MATLAB как клиент, так, чтобы они могли выполнить любые функции, вызванные в их общем блоке кода. Поэтому каждый раз, когда вы используете cd, addpath, или rmpath на клиенте это также выполняется на всех рабочих, если это возможно. Для получения дополнительной информации смотрите parpool страница с описанием. Когда рабочие будут работать на другой платформе, чем клиент, используйте функцию pctRunOnAll правильно установить путь MATLAB на всех рабочих.

Обработка ошибок

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

Ошибки и предупреждения, произведенные на рабочих, аннотируются ID рабочего (labindex) и отображенный в Командном окне клиента в порядке, в котором они получены клиентом MATLAB.

Поведение lastwarn не задано в конце spmd если используется в его теле.

Ограничения spmd

Вложенные функции

В функции, теле spmd оператор не может сослаться на вложенную функцию. Однако это может вызвать вложенную функцию посредством переменной, заданной как указатель на функцию к вложенной функции.

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

Вложенный spmd Операторы

Тело spmd оператор не может непосредственно содержать другого spmd. Однако это может вызвать функцию, которая содержит другого spmd оператор. Внутреннее spmd оператор не запускается параллельно в другом параллельном пуле, но запускается последовательно в одном потоке на рабочем, запускающем его содержание функции.

Вложенный parfor- Циклы

spmd оператор не может содержать a parfor- цикл и тело a parfor- цикл не может содержать spmd оператор. Причина состоит в том, что рабочие не могут запустить, или доступ далее параллельны пулам.

breakпродолжение, и return Операторы

Тело spmd оператор не может содержать break, continue, или return операторы. Рассмотреть parfeval или parfevalOnAll вместо spmd, потому что можно использовать cancel на них.

Глобальные и персистентные переменные

Тело spmd оператор не может содержать global или persistent объявления переменной. Причина состоит в том, что эти переменные не синхронизируются между рабочими. Можно использовать global или persistent переменные в функциях, но их значение только отображается рабочему, который создает их. Вместо global переменные, это - лучшая практика, чтобы использовать аргументы функции для стоимости акций.

Анонимные функции

Тело spmd оператор не может задать анонимную функцию. Однако это может сослаться на анонимную функцию посредством указателя на функцию.

inputname Функции

Используя inputname возвратить имя переменной рабочей области, соответствующее номеру аргумента, не поддержано в spmd. Причиной является тот spmd у рабочих нет доступа к рабочей области рабочего стола MATLAB. Чтобы работать вокруг этого, вызвать inputname перед spmd, как показано в следующем примере.

a = 'a';
myFunction(a)

function X = myFunction(a)
name = inputname(1);
spmd
    X.(name) = labindex;
end
X = [X{:}];
end
    

load Функции

Синтаксисы load это не присваивает структуре output, не поддержаны в spmd операторы. В spmd, всегда присваивайте выход load к структуре.

nargin или nargout Функции

Следующее использование не поддержано в spmd операторы:

  • Используя nargin или nargout без аргумента функции

  • Используя narginchk или nargoutchk проверить количество аргументов ввода или вывода в вызове функции, которая является выполняющимся в данным моментом

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

myFunction('a','b')

function myFunction(a,b)
nin = nargin;
spmd
    X = labindex*nin;
end
end
    

Скрипты псевдокода

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

ans Переменная

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

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

| | | |

Похожие темы