Вы здесь

Запуск частично параллельной программы (c parfor или spmd)

Введение

Частично параллельной будем называть программу, при выполнении которой наряду с последовательными возникают параллельные вычисления, инициируемые параллельными конструкциями языка Matlab parfor и spmd.

Использование параллельного цикла parfor или параллельного блока spmd предполагает предварительное открытие Matlab пула, т.е. выделение необходимого числа процессов (Matlab workers или labs), на локальной машине или на кластере.

Запуск частично параллельных программ с открытием Matlab пула на кластере можно выполнять
(1) по аналогии с запуском параллельных программ из командной строки или в окне системы Matlab (запуск с неявным заданием пула) или
(2) на основе профиля кластера (с версии R2012a, ранее параллельной конфигурации) при работе в окне системы Matlab (запуск с явным заданием пула).

Пользователь может контролировать прохождение своей программы через систему запуска как в окне системы Matlab (с версии R2011b) с помощью Job Monitor (см. пункт меню Parallel), так и из командной строки с помощью команд системы запуска.

1. Запуск частично параллельной программы с неявным заданием пула

При запуске из командной строки вместо команды mlrun (для параллельных программ) следует использовать команду mlprun, например,
    mlprun -np 12 -maxtime 20 my_function '1, {x1, x2}'

а при запуске в окне вместо функции imm_sch использовать функцию imm_sch_pool, например,
    job = imm_sch_pool(12,20,@my_function,1,{x1,x2});

для функции, определенной как
    function y = my_function(x1,x2)

и запущенной на 12 процессах с максимальным временем счета 20 минут.

При этом один процесс будет выполнять программу-функцию, а оставшиеся будут использованы в качестве пула.

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

2. Запуск частично параллельной программы с явным заданием пула
на основе профиля кластера

Явное задание пула возможно при работе в окне Matlab с помощью команды matlabpool (см. help matlabpool). Число выделенных процессов и время, в течение которого они будут доступны пользователю, зависят от заданного профиля кластера (см. пункт меню Help/Product Help/Parallel Computing Toolbox/User's Guide/Programming Overview/Cluster Profiles).
Команда
    matlabpool

без параметров открывает пул, используя профиль по умолчанию с указанным в нем размером пула. В ИММ УрО РАН по умолчанию Matlab пул открывается на узлах кластера (тип кластера Generic), поскольку управляющий компьютер, выступающий в роли локальной машины (Matlab client), не должен использоваться для длительных вычислений.
Пользователь может выбрать профиль по умолчанию из уже существующих профилей или создать новый, используя пункт меню Parallel окна Matlab.

Команда matlabpool с указанием размера пула, например
    matlabpool open 28

открывает пул, переопределяя размер, заданный по умолчанию. При этом следует иметь в виду, что существует ограничение на максимальное число доступных пользователю процессов на кластере.
В результате открытия пула сформированная для кластера работа с именем вида JobN (где N=1,2,...) поступает в распоряжение системы запуска и ставится в очередь на счет. Если свободных процессов достаточно, то пул будет открыт на время, заданное в профиле по умолчанию, с выдачей сообщения вида:
Starting matlabpool using the 'imm_20mins' profile ... Job output will be written to: /home/u1303/my_directory/Job1.mpiexec.out
connected to 28 labs.

Размер пула можно узнать, набрав
    matlabpool size

По завершение вычислений, связанных с пулом, его следует закрыть
    matlabpool close

Внимание. Пул закрывается по истечении времени с диагностикой вида:
The client lost connection to lab 12.
This might be due to network problems, or the interactive matlabpool job might have errored.

Запуск частично параллельной программы на Matlab клиенте
(не разрешается для длительных вычислений)
Итак, схема использования параллельных конструкций parfor и spmd в окне Matlab такова:
    matlabpool
     ...
    % вычисления с использованием parfor или spmd,
    % выполняемые построчно или
    % собранные в программу (частично параллельную)
    % и запущенные из файла
     ...
    matlabpool close

При этом все вычисления, кроме параллельных, выполняет Matlab client (см., например, Introduction to Parallel Solutions/Interactively Run a Loop in Parallel.)

Запуск частично параллельной программы с помощью команды batch
В системе Matlab существует команда (функция) batch, которая позволяет запускать программы в пакетном режиме, разгружая Matlab client (см., например, Introduction to Parallel Solutions/Run a Batch Job). Эта команда выполняется асинхронно, т.е. интерактивная работа пользователя не блокируется.
Где будет выполняться программа и максимально сколько времени, определяется планировщиком (scheduler), заданным в профиле кластера по умолчанию: в ИММ на кластере, тип планировщика generic. Для выполнения программы создается объект Job (работа). Команда batch вида
    job = batch('my_mfile')

(job - ссылка на объект работа)
запускает программу (скрипт или функцию) my_mfile в однопроцессном варианте. В ответ на команду batch выдается сообщение вида
Job output will be written to: /home/u1303/my_directory/Job1.mpiexec.out

содержащее идентификатор работы (ID), равный здесь 1. Сформированная для кластера работа ставится в очередь и при наличии свободных процессов входит в решение с именем очереди вида my_mfile.1.

Для запуска на кластере частично параллельной программы можно использовать команду batch с открытием пула. При этом выделяемое на кластере число процессов будет на 1 больше заданного размера пула.
Так, например, для выполнения команды
    job = batch('my_mfile','matlabpool',11)

потребуется 12 процессов: 1 для программы my_mfile, 11 для пула (см., например, Introduction to Parallel Solutions/Run a Batch Parallel Loop). Время счета здесь определяется временем, заданным в профиле по умолчанию (в аналогичной команде imm_sch_pool все аргументы задаются явно).

Вывод результатов

По завершении работы job можно выдать
1) протокол сеанса
    job.diary

2) результаты работы
    out=job.fetchOutputs
    celldisp(out)

(fetchOutputs вместо getAllOutputArguments в ранних версиях, использовавших конфигурацию кластера, а не профиль)
3) информацию об ошибках (поле ErrorMessage)
    job.Tasks(1)

или
    job.Tasks(1).ErrorMessage