Одна программа несколько данных (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
, 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
, прежде чем вы будете использовать его.
Composite
| parfeval
| parfevalOnAll
| parfor
| spmd