Однопрограммная конструкция языка множественных данных (spmd) обеспечивает плавное перемежение последовательного и параллельного программирования. spmd позволяет определить блок кода для одновременного выполнения на нескольких рабочих. Переменные, назначенные внутри spmd оператор на работников разрешает прямой доступ к их значениям из клиента по ссылке через составные объекты.
В этой главе поясняются некоторые характеристики 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-loop, рабочие, используемые для 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 оператор работает одновременно и знают друг о друге. Как и в случае с сотрудничающим заданием, вы можете напрямую управлять связью между работниками, передавать данные между ними и использовать распределенные между ними массивы.
Например, используйте распределенный по коду массив в spmd заявление:
spmd (3) RR = rand(30, codistributor()); end
У каждого работника есть сегмент coddistributed массива 30 на 10 RR. Дополнительные сведения о распределенных по кодам массивах см. в разделе Работа с распределенными по кодам массивами.
При запуске spmd в параллельном пуле все выходные данные командной строки от работников отображаются в командном окне клиента. Поскольку работники являются сеансами MATLAB без дисплеев, любой графический вывод (например, окна рисунков) из пула вообще не отображается.
Все работники, выполняющие spmd оператор должен иметь тот же путь поиска MATLAB, что и клиент, чтобы они могли выполнять любые функции, вызываемые в их общем блоке кода. Поэтому каждый раз, когда вы используете cd, addpath, или rmpath на клиенте, он также выполняется на всех рабочих, если это возможно. Дополнительные сведения см. в разделе parpool справочная страница. Когда работники работают на платформе, отличной от платформы клиента, используйте функцию pctRunOnAll для правильной установки пути MATLAB для всех работников.
При возникновении ошибки на работнике во время выполнения spmd об ошибке сообщается клиенту. Клиент пытается прервать выполнение для всех работников и передает ошибку пользователю.
Ошибки и предупреждения, создаваемые для работников, аннотируются идентификатором работника (labindex) и отображается в командном окне клиента в том порядке, в котором они принимаются клиентом MATLAB.
Поведение lastwarn не указан в конце spmd если используется внутри его тела.
Внутри функции, тело spmd оператор не может ссылаться на вложенную функцию. Однако она может вызывать вложенную функцию с помощью переменной, определенной как дескриптор функции для вложенной функции.
Потому что spmd body выполняет для работников переменные, которые обновляются вложенными функциями, вызываемыми внутри spmd не обновляются в рабочей области внешней функции.
spmd ЗаявленияТело spmd оператор не может непосредственно содержать другой spmd. Однако он может вызвать функцию, содержащую другую spmd заявление. Внутреннее spmd инструкция не выполняется параллельно в другом параллельном пуле, а выполняется последовательно в одном потоке на работнике, выполняющем функцию, содержащую инструкцию.
parfor- ПетлиОдин spmd инструкция не может содержать parfor-закольцовывание и тело parfor-loop не может содержать 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 которые не назначаются структуре вывода, не поддерживаются внутри 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