Одна программа несколько данных (spmd) построение языка позволяет бесшовное перемежение последовательного программирования и параллельного программирования. spmd
оператор позволяет вам задать блок кода, чтобы запуститься одновременно на нескольких рабочих. Переменные присвоены в spmd
оператор на рабочих предоставляет прямой доступ к их значениям от клиента ссылкой через Составные объекты.
Эта глава объясняет некоторые характеристики spmd
операторы и Composite
объекты.
“Одна программа” аспект spmd означает, что идентичный код работает на нескольких рабочих. Вы запускаете одну программу в клиенте MATLAB® и те части помеченного как 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 без отображений, любой вывод графических данных (например, окна рисунка) от пула не отображается вообще.
Все рабочие, выполняющие spmd
оператор должен иметь тот же путь поиска файлов MATLAB как клиент, так, чтобы они могли выполнить любые функции, вызванные в их общем блоке кода. Поэтому каждый раз, когда вы используете cd
addpath
, или rmpath
на клиенте это также выполняется на всех рабочих, если это возможно. Для получения дополнительной информации смотрите parpool
страница с описанием. Когда рабочие будут работать на другой платформе, чем клиент, используйте функциональный pctRunOnAll
правильно установить путь MATLAB на всех рабочих.
Когда ошибка происходит на рабочем во время выполнения spmd
оператор, об ошибке сообщают клиенту. Клиент пытается прервать выполнение на всех рабочих и выдает ошибку пользователю.
Ошибки и предупреждения, произведенные на рабочих, аннотируются ID рабочего (labindex
) и отображенный в Командном окне клиента в порядке, в котором они получены клиентом MATLAB.
Поведение lastwarn
не задано в конце spmd
если используется в его теле.
В функции, теле spmd
оператор не может сослаться на вложенную функцию. Однако это может вызвать вложенную функцию посредством переменной, заданной как указатель на функцию к вложенной функции.
Поскольку spmd
тело выполняется на рабочих, переменные, которые обновляются вложенными функциями, названными в spmd
оператор не обновляется в рабочей области внешней функции.
spmd
ОператорыТело spmd
оператор не может непосредственно содержать другой spmd
. Однако это может вызвать функцию, которая содержит другой spmd
оператор. Внутренний spmd
оператор не запускается параллельно в другом параллельном пуле, но запускается последовательно в одном потоке на рабочем, запускающем его содержание функции.
parfor
- Циклыspmd
оператор не может содержать parfor
- цикл и тело parfor
- цикл не может содержать spmd
оператор. Причина состоит в том, что рабочие не могут запустить, или доступ далее параллельны пулам.
break
продолжение
, и return
ОператорыТело spmd
оператор не может содержать break
продолжение
, или 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
переменная, прежде чем вы будете использовать его.
Composite
| parfeval
| parfevalOnAll
| parfor
| spmd