Конструкция языка множественных данных (spmd) одной программы позволяет плавное перемежение последовательного и параллельного программирования. The spmd
оператор позволяет вам задать блок кода для одновременного выполнения на нескольких рабочих местах. Переменные, назначенные внутри spmd
оператор рабочих процессов позволяет прямой доступ к их значениям от клиента путем ссылки через объекты Composite.
В этой главе поясняются некоторые характеристики spmd
операторы и Composite
объекты.
Аспект «одной программы» spmd означает, что идентичный код запускается на нескольких рабочих местах. Вы запускаете одну программу в MATLAB® клиент, и те его части помечены как spmd
блоки работают на рабочих. Когда блок spmd завершен, ваша программа продолжает выполняться в клиенте.
Аспект «нескольких данных» означает, что, хотя spmd
оператор запускает идентичный код для всех работников, каждый работник может иметь различные, уникальные данные для этого кода. Таким образом, несколько наборов данных могут быть размещены несколькими работниками.
Типичные приложения, подходящие для spmd
являются теми, которые требуют одновременного выполнения программы на нескольких наборах данных, когда между работниками требуется связь или синхронизация. Некоторые общие случаи:
Программы, выполнение которых занимает много времени - spmd
позволяет нескольким рабочим вычислять решения одновременно.
Программы, работающие на больших наборах данных - spmd
позволяет распределять данные между несколькими работниками.
Для получения дополнительной информации смотрите Выбор между spmd, parfor и parfeval.
Общая форма 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 массива в spmd
оператор:
spmd (3) RR = rand(30, codistributor()); end
Каждый рабочий процесс имеет сегмент 30 на 10 кодируемого массива RR
. Для получения дополнительной информации о codistributed arrays, смотрите Работа с Codistributed Arrays.
При запуске spmd
оператор в параллельном пуле, все выходные данные командной строки работников отображаются в Командном окне клиента. Поскольку рабочие Сеансы работы с MATLAB без отображений, любые графические выходы (для примера, окон рисунка) из пула вообще не отображаются.
Все работники, выполняющие spmd
оператор должен иметь тот же путь поиска файлов MATLAB, что и клиент, чтобы они могли выполнять любые функции, вызываемые в их общем блоке кода. Поэтому всякий раз, когда вы используете cd
, addpath
, или rmpath
на клиенте, он также выполняется на всех рабочих, по возможности. Для получения дополнительной информации смотрите parpool
страница с описанием. Когда работники работают на другой платформе, чем клиент, используйте функцию pctRunOnAll
для правильной установки пути MATLAB для всех работников.
Когда ошибка возникает у работника во время выполнения spmd
оператор, об ошибке сообщается клиенту. Клиент пытается прервать выполнение на всех рабочих местах и выдает пользователю ошибку.
Ошибки и предупреждения, созданные для работников, аннотируются идентификатором работника (labindex
) и отображается в Командном окне клиента в том порядке, в котором они получены клиентом MATLAB.
Поведение lastwarn
не задан в конце spmd
если используется в его теле.
Внутри функции, тела spmd
оператор не может ссылаться на вложенную функцию. Однако он может вызвать вложенную функцию с помощью переменной, заданной как указатель на функцию, к вложенной функции.
Потому что spmd
тело выполняется на рабочих местах, переменные, которые обновляются вложенными функциями, вызываемыми внутри spmd
оператор не обновляется в рабочей области внешней функции.
spmd
ОператорыТело spmd
оператор не может непосредственно содержать другой spmd
. Однако он может вызвать функцию, которая содержит другую spmd
оператор. Внутреннее spmd
оператор не запускается параллельно в другом параллельном пуле, но запускается последовательно в одном потоке на работнике, выполняющем функцию, содержащую его.
parfor
- ЦиклыОдин spmd
оператор не может содержать parfor
-цикл, и тело a parfor
-цикл не может содержать spmd
оператор. Причина заключается в том, что работники не могут запускать или получать доступ к дальнейшим параллельным пулам.
break
, continue
, и 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
Вы можете вызвать файлы скрипта P-кода из spmd
оператор, но скрипты P-кода не могут содержать spmd
оператор. Чтобы обойти это, используйте функцию P-кода вместо скрипта P-кода.
ans
ПеременнаяСсылки на ans
переменная, заданная вне spmd
оператор не поддерживается в spmd
оператор. Внутри тела spmd
оператор, вы должны назначить ans
переменная перед использованием.
Composite
| parfeval
| parfevalOnAll
| parfor
| spmd