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

Введение

Конструкция языка множественных данных (spmd) одной программы позволяет плавное перемежение последовательного и параллельного программирования. The spmd оператор позволяет вам задать блок кода для одновременного выполнения на нескольких рабочих местах. Переменные, назначенные внутри spmd оператор рабочих процессов позволяет прямой доступ к их значениям от клиента путем ссылки через объекты Composite.

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

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

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

Аспект «нескольких данных» означает, что, хотя spmd оператор запускает идентичный код для всех работников, каждый работник может иметь различные, уникальные данные для этого кода. Таким образом, несколько наборов данных могут быть размещены несколькими работниками.

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

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

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

Для получения дополнительной информации смотрите Выбор между spmd, parfor и parfeval.

Задайте оператора 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 массива в spmd оператор:

spmd (3)
    RR = rand(30, codistributor());
end

Каждый рабочий процесс имеет сегмент 30 на 10 кодируемого массива RR. Для получения дополнительной информации о codistributed arrays, смотрите Работа с Codistributed Arrays.

Отобразите вывод

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

Путь MATLAB

Все работники, выполняющие spmd оператор должен иметь тот же путь поиска файлов MATLAB, что и клиент, чтобы они могли выполнять любые функции, вызываемые в их общем блоке кода. Поэтому всякий раз, когда вы используете cd, addpath, или rmpath на клиенте, он также выполняется на всех рабочих, по возможности. Для получения дополнительной информации смотрите parpool страница с описанием. Когда работники работают на другой платформе, чем клиент, используйте функцию pctRunOnAll для правильной установки пути MATLAB для всех работников.

Обработка ошибок

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

Ошибки и предупреждения, созданные для работников, аннотируются идентификатором работника (labindex) и отображается в Командном окне клиента в том порядке, в котором они получены клиентом MATLAB.

Поведение lastwarn не задан в конце spmd если используется в его теле.

Ограничения 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-кода

Вы можете вызвать файлы скрипта P-кода из spmd оператор, но скрипты P-кода не могут содержать spmd оператор. Чтобы обойти это, используйте функцию P-кода вместо скрипта P-кода.

ans Переменная

Ссылки на ans переменная, заданная вне spmd оператор не поддерживается в spmd оператор. Внутри тела spmd оператор, вы должны назначить ans переменная перед использованием.

См. также

| | | |

Похожие темы