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

Введение

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

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

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

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

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

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

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

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

Задайте 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 не может содержать parfor - цикл и тело parfor - цикл не может содержать оператор spmd. Причина состоит в том, что рабочие не могут запустить, или доступ далее параллельны пулам.

break, continue и операторы return

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

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

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

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

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

Функции load

Синтаксисы load, которые не присваивают выходной структуре, не поддержаны в операторах 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, прежде чем вы будете использовать его.

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

| | | |

Похожие темы