Компиляция и запуск параллельных задач в среде Grid

В EGEE предусмотрена возможность работы с параллельными программами с помощью MPI-1 (LAM и MPICH) и MPI-2 (OpenMPI и MPICH2).
Задача на счет в среде Grid отправляется с помощью mpi-start скриптов, разработанных в рамках проекта Interactive European Grid рабочей группой MPI.
Эти скрипты доступны на сайте :
https://twiki.cern.ch/twiki/bin/view/EGEE/MpiTools 

При расчетах в среде Grid для любой задачи требуется скрипт-файл с расширением jdl. При использовании mpi-start системы от пользователя дополнительно требуется создание запускающего и завершающего скриптов.

Таким образом, для расчета параллельной задачи в Grid требуется следующее:
1. Действительный сертификат пользователя, подписанный одним из удостоверяющих центров, признаваемый grid-сайтами (usercert.pem) и соответствующий этому сертификату закрытый ключ (userkey.pem);
2. JDL-файл для запуска задачи в Grid с указанием в этом файле требований к программному обеспечению (ПО), если при запуске задачи явно не указывается вычислительный элемент;
3. Если запуск задачи происходит с явным указанием вычислительного элемента, то предварительно необходимо запросить информационную систему Grid с целью убедиться, что он (элемент) имеет всё необходимое для задачи ПО (MPICH, OpenMPI, MPI-START);
4. mpi-start-wrapper.sh — файл, определяющий переменные среды;
5. mpi-hooks.sh — файл, который подготавливает задачу к запуску, компилирует и после завершения выводит сообщение.

Начнем со второго пункта. Обычно существующее программное обеспечение публикуется в информационных службах самих grid-сайтов. Это может быть MPICH или OPENMPI. Именно эти значения должны указываться в JDL-файле в атрибуте Arguments и в атрибуте Requirements, если при запуске задачи явно не указывается вычислительный элемент.

Приводим вариант такого файла:
# myprog.jdl
#
Type = «Job»
# JobType принимает значения:
# MpiCh | Normal | Partitionable | Parametric | Checkpointable
JobType = «Normal»;
# Число процессоров:
CPUNumber = 4;
# Исполняемый скрипт-файл:
Executable = «mpi-start-wrapper.sh»;
# Аргументы — исполняемый файл и среда (ПО):
Arguments = «myprog MPICH»;
# Файл для вывода данных на стандартный вывод:
StdOutput = «myprog.out»;
# Файл для ошибок:
StdError = «myprog.err»;
# Поток файлов, отправляемых на узел для выполнения:
InputSandbox = {«mpi-start-wrapper.sh»,»mpi-hooks.sh»,»myprog.c»};
# Поток результирующих файлов:
OutputSandbox = {«myprog.err»,»myprog.out»};
Requirements =
Member(«MPI-START»,other.GlueHostApplicationSoftwareRunTimeEnvironment)&&
Member(«OPENMPI-1.3.2»,other.GlueHostApplicationSoftwareRunTimeEnvironment);
#
# — the end
Если среда реализована в OpenMPI, то в значении атрибута Arguments надо заменить MPICH на OPENMPI.
Команда
glite-wms-job-list-match -a myprog.jdl
выводит список доступных именно для этой задачи вычислительных элементов в соответствии с информацией в файле описания задачи и правами пользователя, вытекающими из его сертификата. Например, на lxpub04.jinr.ru можно получить:

Connecting to the service
https://lcg16.sinp.msu.ru:7443/glite_wms_wmproxy_server
===============================================================
COMPUTING ELEMENT IDs LIST
The following CE(s) matching your job requirements have been found:
*CEId*
— cms-eth0-1.kipt.kharkov.ua:2119/jobmanager-lcgpbs-rgstest
— grid129.sinp.msu.ru:2119/jobmanager-lcgpbs-rgstest
— lcgce01.jinr.ru:2119/jobmanager-lcgpbs-rgstest
— lcgce02.jinr.ru:2119/jobmanager-lcgpbs-rgstest
— lcgce21.jinr.ru:8443/cream-pbs-rgstest
— grid-ce.icp.ac.ru:2119/jobmanager-lcgpbs-rgstest
— grid-ce.icp.ac.ru:2119/jobmanager-lcgpbs-test1
=============================================================

Файл, определяющий переменные среды, имеет вид:

#!/bin/bash
# mpi-start-wrapper.sh
# Присваиваем переменным имя исполняемого файла (myprog) и ПО (MPICH)
# из Arguments JDL-файла:
MY_EXECUTABLE=`pwd`/$1
MPI_FLAVOR=$2
# Перевод прописных букв в строчные в MPI_FLAVOR для отправки на mpi-start:
MPI_FLAVOR_LOWER=`echo $MPI_FLAVOR | tr ‘[:upper:]’ ‘[:lower:]’`
# Укажем правильный путь к ПО на основе данного параметра:
eval MPI_PATH=`printenv MPI_${MPI_FLAVOR}_PATH`
# Присвоим переменной путь к grid-интерфейсу:
eval I2G_${MPI_FLAVOR}_PREFIX=$MPI_PATH
export I2G_${MPI_FLAVOR}_PREFIX

# Создание исполняемого файла с формальным именем (локализация):
touch $MY_EXECUTABLE
# Формирование переменных для mpi-start:
export I2G_MPI_APPLICATION=$MY_EXECUTABLE
export I2G_MPI_APPLICATION_ARGS=
export I2G_MPI_TYPE=$MPI_FLAVOR_LOWER
export I2G_MPI_PRE_RUN_HOOK=mpi-hooks.sh
export I2G_MPI_TYPE=$MPI_FLAVOR_LOWER
export I2G_MPI_PRE_RUN_HOOK=mpi-hooks.sh
export I2G_MPI_POST_RUN_HOOK=mpi-hooks.sh
# Для включения в протокол выполнения задачи отладочной информации
# надо раскомментировать 3 строки, приведённые ниже:
#export I2G_MPI_START_VERBOSE=1
#export I2G_MPI_START_DEBUG=1
#export I2G_MPI_START_TRACE=1
echo «Start: $I2G_MPI_START»
# Вызов mpi-start:
$I2G_MPI_START

Последний вспомогательный файл состоит из двух частей.                    Первая часть, в соответствии с аргументом OPMENMPI или MPICH, компилирует параллельную программу, а вторая — выводит сообщения о завершении работы:

#!/bin/sh
# mpi-hook.sh
#
# Следующая функция вызывается перед тем, как исполняемый MPI-файл стартует:
#
pre_run_hook () {
# Выводим некоторые параметры компиляции:
#echo «Compiling ${I2G_MPI_APPLICATION}»
#echo «OPTS=${MPI_MPICC_OPTS}»
#echo «PROG=${I2G_MPI_APPLICATION}.c»
# Компиляция программы и получение исполняемого файла:
cmd=» mpicc -o myprog myprog.c »
echo $cmd
$cmd
if [ ! $? -eq 0 ]; then
echo «Error compiling program. Exiting…»
exit 1
fi
# Если компиляция прошла успешно:
echo «Successfully compiled ${I2G_MPI_APPLICATION}»
return 0
}
# Следующая функция вызывается перед завершением исполняемого MPI-файла:
#
post_run_hook () {
echo «Executing post hook.»
echo «Finished the post hook.»
return 0
}

После формирования этих двух вспомогательных и одного JDL файлов задачу можно отправлять для счета командой:
glite-wms-job-submit -a myprog.jdl ,
если требования к среде окружения были указаны в файле описания задачи;
либо командой:
glite-wms-job-submit -a -r myprog.jdl ,
если указывается конкретный вычислительный элемент                                         ( вычислительный элемент конкретного grid-узла).

Например:
(символ «\» означает, что следующие 2 строки составляют одну команду)

lxpub04:~ > glite-wms-job-submit -a -r \
grid-ce.icp.ac.ru:2119/jobmanager-lcgpbs-rgstest myprog.jdl

Connecting to the service
https://lcg16.sinp.msu.ru:7443/glite_wms_wmproxy_server
===============glite-wms-job-submit Success =====================
The job has been successfully submitted to the WMProxy
Your job identifier is:
https://lcg16.sinp.msu.ru:9000/OJhpNW-Z4xNvd7gIIQCCKA
===========================================================

Задаче присваивается идентификатор:
https://lcg16.sinp.msu.ru:9000/OJhpNW-Z4xNvd7gIIQCCKA ,
по которому можно проверять статус задачи командой:

lxpub04:~ > glite-wms-job-status \
https://lcg16.sinp.msu.ru:9000/OJhpNW-Z4xNvd7gIIQCCKA
*************************************************************
BOOKKEEPING INFORMATION:
Status info for the Job :
https://lcg16.sinp.msu.ru:9000/OJhpNW-Z4xNvd7gIIQCCKA
Current Status: Scheduled
Status Reason: Job successfully submitted to Globus
Destination: grid-ce.icp.ac.ru:2119/jobmanager-lcgpbs-rgstest
Submitted: Thu Jan 21 15:49:06 2010 MSK
*************************************************************

Как видно из этой таблицы, выводятся четыре параметра:

Current Status :   текущий статус, принимает значения:
а) Scheduled — задача принята;
б) Running — задача запущена на счет;
в) Done — расчеты завершены.

Status Reason: действие, происходящее при текущем статусе, принимает значения:
а) unavailable — неопределенность, возможно задача не будет приниматься;
б) Job successfully submitted to Globus — задача успешно отправлена на узел;
в) Job terminated successfully — расчеты завершены удачно.

Destination:  показывает gridузел, куда отправляется/отправлена задача.

Submitted — начало отправки.

После успешного завершения задачи можно забрать результаты её работы командой:

lxpub04:~ > glite-wms-job-output —dir myprogout \
https://lcg16.sinp.msu.ru:9000/OJhpNW-Z4xNvd7gIIQCCKA
Connecting to the service
https://lcg16.sinp.msu.ru:7443/glite_wms_wmproxy_server
============================================================
JOB GET OUTPUT OUTCOME
Output sandbox files for the job:
https://lcg16.sinp.msu.ru:9000/OJhpNW-Z4xNvd7gIIQCCKA
have been successfully retrieved and stored in the directory:
/afs/jinr.ru/user/d/dushanov/myprogout
==================================================================
В этом случае полученные данные (myprog.out, myprog.err) скопируются в каталог myprogout.
Э.Б.Душанов, Т.Ф.Сапожникова