ИПМ им. М.В. Келдыша РАН.
Отдел ИВСиЛС, сектор эксплуатации МВС.
А.В. Баранов
А.О. Лацис
C.В. Сажин
М.Ю. Храмцов
Список коммуникационных сред (библиотек, трансляторов и т. п.), доступных пользователям МВС-1000/16, является открытым. Как минимум, предоставляется возможность использовать следующие средства: MPI (реализация MPICH), MPI (реализация LAM), библиотека TCP Router.
Подготовка программ, использующих MPI, происходит традиционными командами: mpicc, mpif77 и др. При использовании MPICH и LAM требуются разные версии этих команд. По умолчанию в пути у пользователей находятся варианты для MPICH. Если требуется скомпилировать для LAM, следует указывать полный путь к соответствующим командам, находящимся в /usr/bin.
Таким образом:
mpicc –o prog prog.c – транслировать для MPICH,
/usr/bin/mpicc –o prog prog.c – транслировать для LAM.
Запуск программ, подготовленных для MPICH, производится командой mpirun, при этом для указания числа процессоров в задаче используется ключ “-np”, например:
mpirun –np 4 prog – запустить на 4-х процессоров программу, подготовленную для MPICH.
Для запуска программ, рассчитанных на LAM, следует использовать команду lamrun, например:
lamrun –np 4 prog – запустить на 4-х процессорах программу, подготовленную для LAM.
Программы, использующие TCP Router, не требуют для подготовки специальных команд. Достаточно указать библиотеку и, в случае программы на “C”, соответствующий include-файл. Примеры программ, а также команд для их трансляции, можно найти в
/common/router.example
Для запуска подготовленных таким образом программ используется команда routerrun, например:
routerrun –np 4 prog – запустить на 4-х процессорах программу, подготовленную для TCP Router.
Все упомянутые выше команды запуска (mpirun, lamrun, routerrun) имеют, помимо ключа “-np”, еще ряд полезных ключей. Подробнее о них можно прочитать в «Инструкции пользователю МВС-1000/16», в описании команды mpirun. Сказанное там о дополнительных ключах mpirun в равной мере относится и к командам lamrun и routerrun.
Запуск программ для TCP Router несколько отличается от запуска программ для обоих вариантов MPI.
Во-первых, стандартные выводы от каждого из процессоров, в отличие от случая MPI, направляются в отдельные файлы, а не в один общий. В тот файл, который называется “output” и который система запуска считает единым стандартным выводом всей параллельной программы, попадает в случае программ на router только стандартный вывод 0-го процессора. Стандартные выводы 1-го, 2-го и т. д. процессоров попадают в расположенные в той же директории файлы “output1”, “output2” и т. д., соответственно. Эти файлы недоступны для просмотра командой mout, но могут просматриваться пользователем вручную. Подробнее о команде mout, перенаправлении стандартного вывода, размещении соответствующих файлов и подобных вопросах можно прочитать в «Инструкции пользователю».
Во-вторых, при использовании router не полностью автоматизировано управление ресурсами, необходимыми для запуска.
В некоторых, довольно редких случаях это может приводить к отказам при попытке запуска программы командой routerrun, причем в файле output появится диагностика, содержащая слова “router.conf”. Если с Вами такое случилось, прочитайте все изложенное ниже, в противном случае – не читайте.
При запуске командой routerrun параллельной программы в ее текущей директории создается служебный файл с фиксированным именем “router.conf”, содержимое которого специфично для данного конкретного запуска. Пока на всех процессорах не отработает обращение к функции rf_create(), данный файл не должен ни модифицироваться, ни удаляться. Следовательно, некоторое время после запуска программы командой routerrun запуск той же командой программ из той же текущей директории невозможен. С другой стороны, время, в течение которого запуск невозможен, точному определению не поддается: теоретически ничто не мешает прикладному программисту написать программу, в которой все или некоторые процессы вызывают rf_create(), скажем, через полчаса или час после начала работы, хотя обычно речь идет все-таки о секундах.
В результате возможно появление двух проблем:
1). Вы запускаете программу из той же текущей директории сразу после запуска предыдущей, когда предыдущий файл router.conf еще существует. В этом случае запуск не произойдет, причем в файле output появится соответствующая диагностика. Требуется подождать, пока router.conf исчезнет (его автоматически удалит последний сработавший rf_create() предыдущей программы), и повторить запуск.
2). При выполнении предыдущей программы произошла авария до того, как во всех процессах проработало обращение к rf_create(). В этом случае предыдущий router.conf удалить будет некому, и Вам придется сделать это вручную, чтобы запуск из этой директории снова стал возможен.
Рекомендации по преодолению указанных трудностей:
1). Всегда начинайте Вашу программу с вызова rf_create() или ее Фортранного эквивалента. До этого вызова не выполняйте никаких рискованных или непредсказуемых по продолжительности действий, как то: обработка параметров командной строки, операции деления и умножения, файловый ввод/вывод.
2). Избегайте одновременного исполнения программ с одной и той же текущей директорией. На практике это совсем не трудно, поскольку подавляющее большинство реальных расчетных программ открывают на запись в текущей директории файлы с фиксированными именами, что делает одновременное выполнение нескольких таких программ бессмысленным.