Очередью заданий на системах IBM Blue Gene/P и Regatta, установленных на факультете ВМК МГУ, управляет планировщик IBM Tivoli LoadLeveler. Чтобы поставить задание в очередь, необходимо подготовить специальный командный файл, в котором будет указан путь к исполняемому файлу и запрашиваемые программой ресурсы. Вопросы запуска заданий и управления очередью рассмотрены в отдельных секциях. Необходимо подчеркнуть, что на этом сайте мы не рассматриваем многошаговые задания и зависимости между шагами; интересующийся пользователь может найти описание указанных тем в официальной документации. В данном разделе описывается формат командного файла для запуска заданий на системе Blue Gene/P:
Имя командного файла является любым допустимым в данной операционной системе, но традиционно имеет расширение jcf («jcf» — сокращение от «job command file» — командный файл задачи). Рассмотрим пример простейшего командного файла bgp_run.jcf:
# @ job_type = bluegene # @ class = large # @ output = $(jobid).out # @ error = $(jobid).err # @ wall_clock_limit = 00:05:00 # @ bg_size = 128 # @ queue /bgsys/drivers/ppcfloor/bin/mpirun -exe /gpfs/data/pozdneev/test/a.out -env OMP_NUM_THREADS=2 -mode DUAL
Строки, начинающиеся с символов # @, задают параметры планировщику. Команда
# @ job_type = bluegene
является обязательной — она информирует LoadLeveler о том, что задача предназначена для системы Blue Gene. Следующая строка
# @ class = large
определяет класс запускаемой задачи. В общем случае в системе может быть предопределено несколько классов задач, отличающихся приоритетом и требуемыми ресурсами. Строки
# @ output = $(jobid).out # @ error = $(jobid).err
указывают планировщику, какие имена присвоить файлам стандартного вывода и потока сообщений об ошибках. Переменная $(jobid) будет автоматически заменена LoadLeveler'ом на уникальный числовой идентификатор задания. Файлы будут созданы в текущей директории. Лимит счетного времени в формате чч:мм:сс пользователь задает командой
# @ wall_clock_limit = 00:05:00
Время начинает отсчитываться с момента принятия задачи на счет, но не с момента постановки ее в очередь. Если программа превышает указанный пользователем лимит времени, она принудительно снимается системой со счета.
Число вычислительных узлов, которые будут выделены для задачи, указывается командой
# @ bg_size = 128
Доступны следующие значения: 128, 256, 512, 1024 и 2048. После подключения дополнительных узлов ввода-вывода, станет возможно использовать разделы, включающие 64 вычислительных узла. Строка
# @ queue
также является обязательной и отмечает конец списка операторов. Исполняемый файл, режим запуска, число OpenMP-нитей и путь к программе mpirun указываются в последней строчке командного файла:
/bgsys/drivers/ppcfloor/bin/mpirun -exe /gpfs/data/pozdneev/test/a.out -env OMP_NUM_THREADS=2 -mode DUAL
Обратите внимание, что для OpenMP-программ, которые запускаются в VN- или DUAL-режимах, необходимо явным образом указывать число нитей (-env OMP_NUM_THREADS=1 и -env OMP_NUM_THREADS=2 соответственно), в противном случае система попытается создать четыре нити, и программа будет аварийно завершена.
Задание LoadLeveler'а в общем случае состоит из одного или нескольких шагов (job steps), которые определяются в одном командном файле. Кроме параметров, указывающих запрашиваемые ресурсы, в командном файле можно задать имя для задания и его конкретных шагов.
#@ job_type = bluegene # @ bg_connection = PREFER_TORUS # @ bg_size = 128
# # Single pound sign (#) is normally used only in the beginning # of a jcf and after keyword statements # ### Let's comment out the following line for a while ##@ environment = COPY_ALL # ### Triple pound sign (###) is typically used between keyword ### statements to improve readability #
# @ bg_connection=PREFER_TORUS # @ environment = COPY_ALL ; MPIRUN_MODE=DUAL;MPIRUN_LABEL =1; MPIRUN_VERBOSE= 2
# @ environment = \ COPY_ALL; \ MPIRUN_MODE = DUAL; \ MPIRUN_LABEL = 1; \ MPIRUN_VERBOSE = 2;
#@ JOB_TYPE = bluegene #@ ErRoR = $(jobid).err #@ Bg_Connection = PREFER_TORUS #@ BG_size = 128
Обратите внимание, что командный файл должен подчиняться соглашениям UNIX о формате текстовых файлов. Т.е., если вы подготовили файл с использованием Windows-редактора, и признаком окончания строки в нем служит пара символов OD OA, то вам будет необходимо воспользоваться утилитой dos2unix, чтобы преобразовать файл к формату UNIX, например,
$> dos2unix run.jcf
В противном случае вы будете получать сообщения о неправильных параметрах:
<Oct 15 19:21:36.296950> FE_MPI (ERROR): Incorrect value on the '-mode' command line option: 'DUAL ' Try /bgsys/drivers/ppcfloor/bin/mpirun -help for more details
Параметры задания специфицируются с использованием ключевых слов. Если после ключевого слова не указано никакого значения, ключевое слово игнорируется.
Ключевое слово | Описание |
---|---|
bg_connection = TORUS | MESH | PREFER_TORUS | Тип запрашиваемой топологии:
Если запрашиваемая топология недоступна для специфицированного числа вычислительных узлов или указанного раздела, то задание не может быть принято к исполнению и будет переведено в состояние Idle. Диагностическое сообщение, выдаваемое командой llq -l <jobid> будет содержать строку примерно следующего вида: bg_connection=TORUS not supported for small partitions. |
bg_partition | Запустить задачу на одном из предопределенных разделов (см. тж. команду llstatus); это ключевое слово несовместимо с ключевыми словами bg_size, bg_connection и некоторыми другими, которые здесь не описаны. |
bg_size | Число запрашиваемых вычислительных узлов. Может принимать следующие значения: 128, 256, 512, 1024, 2048. После ввода в строй дополнительных узлов ввода-вывода станет доступно значение 64. |
class | Класс задачи (см. тж. команду llclass) |
environment | Описывает переменные окружения задачи, их список разделяется точками с запятыми. Возможны следующие значения:
|
error | Имя файла, в который будет направлен поток stderr. Обычно используют значение (о переменной $(jobid) см. ниже): # @ error = $(jobid).err |
initialdir | Рабочая директория, в которую переходит LoadLeveler, когда начинает выполнять задание. Не начинающиеся с прямой косой черты (slash, /) пути считаются относительными к данной директории. Значением по умолчанию является путь к директории, из которой задание было поставлено в очередь. Доступ к этой директории со стороны вычислительной системы будет проверен на этапе постановки задачи в очередь. Если директория будет недоступна, то запуск задачи завершится неудачно. |
input | Имя файла, который с которым будет ассоциирован stdin. По умолчанию это /dev/null. |
job_type | Тип задания. На системе Blue Gene/P этому ключевому слову должно
быть присвоено значение bluegene:
# @ job_type = bluegene |
notification = always | error | start | never | complete | Определяет, в каких случаях извещать пользователя, указанного в notify_user:
|
notify_user | Имя пользователя или электронный адрес, на который будет отсылаться почта при наступлении события, указанного в notification, например # @ notify_user = yourusername или # @ notify_user = yourusername@example.com |
output | Имя файла, в который будет направлен поток stdout. Обычно используют значение (о переменной $(jobid) см. ниже): # @ output = $(jobid).out |
queue | Помещает задание в очередь. Этот оператор обязателен. |
wall_clock_limit | Лимит счетного времени в формате чч:мм:сс или мм:сс или сс;
время отсчитывается с момента принятия задачи к счету
(но не с момента отправки задачи в очередь):
# @ wall_clock_limit = 12:00:00 |
Диспетчер очереди LoadLeveler определяет несколько переменных, которые доступные для использования в командном файле. Например, их можно использовать для задания уникальных имен для файлов, с которыми будут связаны стандартные потоки вывода и ошибок. Обращение к переменным осуществляется как
$(variable_name)
Среди доступных переменных выделим следующие:
Переменная | Описание |
---|---|
$(jobid) | Номер задания |
$(stepid) | Номер этапа в рамках задания (подробнее об этапах заданий можно прочитать в официальной документациии |
Текст составлен на основе материала книги «Tivoli Workload Scheduler LoadLeveler: Using and Administering» (Version 3 Release 4.3)