Вы находитесь на странице: 1из 7

Инструкция по выполнению задания на ВС IBM pSeries 690

Regatta (regatta.cs.msu.su)
В.Ю.Воронова, Н.Н.Попова

Вычислительная система Regatta представляет собой 16-


процессорную систему с разделяемой памятью. Система работает под
управлением операционной системы Linux. Система представляет собой
комплекс, состоящий из двух машин состоит из двух машин:
1) regatta.cs.msu.su, фронтэнд. Вся связь с комплексом
осуществляется только через эту машину (по протоколу ssh). Она
предназначена для компилирования проектов и для выполнения задач,
не требующих большой вычислительной мощности (конфигурация:
2хPower4 процессора, 4 GB памяти).
2) regata2.cs.msu.su. вычислитель. Машина предназначена только
для выполнения задач поставленных в очередь на планировщике
(конфигурация 16xPower4 процессора, 64GB памяти).
1. Выход на систему
ssh –X <login>@regatta.cs.msu.su
login – логин пользователя.
Например, для пользователя с логином st007:
ssh –X st007@regatta.cs.msu.su

2. Копирование файлов с локальной машины на Regatta


выполняется командой scp.
На ЛОКАЛЬНОЙ МАШИНЕ необходимо выполнить:
scp hello.c st007@regatta.cs.msu.su:~st007/hello.c
3. Трансляция, запуск и получение результатов
параллельных приложений.
Компиляция программы осуществляется утилитой mpicc.
Ниже приведены примеры простейшей программы, использующей
основные функции стандарта Message Passing Interface.

Примеры программы “Hello, World!” с использованием MPi


“Hello, World!” на C – MPI “Hello, World!” на Fortran90 – MPI
#include <stdio.h> program hello
#include "mpi.h" // заголовочный файл mpi C Заголовочный файл MPI
include 'mpif.h'
main(int argc, char **argv) integer rank, size, ierror, tag, status(MPI_STATUS_SIZE)
{ character(12) message
int rank, size, tag, rc, i;
MPI_Status status; C Инициализация параллельной части программы
char message[20]; call MPI_INIT(ierror)
// инициализация параллельной части программы C Определить количество процессов
rc = MPI_Init(&argc, &argv); call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierror)
// определить число процессов C Определить собственный номер
rc = MPI_Comm_size(MPI_COMM_WORLD, &size); call MPI_COMM_RANK(MPI_COMM_WORLD, rank,
// определить собственный номер ierror)
rc = MPI_Comm_rank(MPI_COMM_WORLD, &rank);
С Метка сообщения
tag = 7; // метка передаваемого сообщения tag = 7
// участок кода для процесса с номером 0
if (rank == 0) C Участок кода для мастера – процесса с номером 0
{ if (rank .eq. 0) then
strcpy(message, "Hello, world!"); message = 'Hello, world'
// отправить сообщение всем процессам, кроме do i=1, size-1, 1
себя C Отправить всем процессам, кроме себя, сообщение
for (i = 1; i < size; i++) Hello, world
rc = MPI_Send(message, 13, MPI_CHAR, i, tag, call MPI_SEND(message, 12, MPI_CHARACTER,i,
MPI_COMM_WORLD); tag, MPI_COMM_WORLD, ierror)
} enddo
// участок кода для процессов с номерами от 1 до C Участок кода для процессов с номерами от 0 до size-1
size-1 else
else C Принять сообщение от процесса с номером 0
// принять сообщение от процесса с номером 0 call MPI_RECV(message, 12, MPI_CHARACTER, 0,
rc = MPI_Recv(message, 13, MPI_CHAR, 0, tag, tag,MPI_COMM_WORLD, status, ierror)
MPI_COMM_WORLD, &status); endif

// напечатать приветствие и собственный C Напечатать приветствие и собственный номер


номер print*, 'node', rank, ':', message
printf("node %d : %.13s\n", rank, message);
// участок для процесса-мастера – напечатать С Нить-мастер печатает общее количество процессов
общее число процессов if (rank .eq. 0) then
if (rank == 0) print*, ‘Number of processes = ’, size
printf(“Number of processes = %d\n”, endif
size);
C Завершение параллельной секции
// завершение параллельной секции call MPI_FINALIZE(ierror)
rc = MPI_Finalize(); end
}

Для компиляции mpi-приложений используются следующие утилиты:


 mpicc – С компилятор,
 mpiCC – C++ компилятор,
 mpif – Fortran 77 компилятор,
 mpif90 – Fortran 90 компилятор.
Например, чтобы откомпилировать программу “Нello, World!” (см.
листинг), сохраненную в файле hello.c, (hello.f соответственно)
необходимо в директории, в которой находится hello.c (hello.f),
выполнить команду
mpicc –o hello hello.c mpif90 –o hello hello.f
(для С-программы) (для Fortran90-программы)
В обоих случаях исполняемый файл – hello.
Можно также выполнить команду без дополнительных опций:
mpicc hello.c mpif90 hello.f
(для С-программы) (для Fortran90-программы)
В этом случае по умолчанию исполняемый файл - a.out.
Опция –о – стандартная опция компиляторов (не только mpicc, но
и xlc и gcc). Ключ -о filename задаёт имя файла, который будет получен
как результат деятельности компилятора. Также при компиляции
программ можно использовать другие стандартные (используемые в
случае любого компилятора) опции:
-I include_dir - опция, которая задаёт пути для поиска include-
файлов.
-L library_dir - задаёт пути для поиска подключаемых библиотек.
-l library_name - линкует с указанной библиотекой,
-c - только компиляция без линковки.
-g - добавление отладочной информации в бинарный код, после
этого при запуске программы через отладчик будет доступна
информация об исходном коде программы.
Кроме стандартных ключей компиляторов, при компиляции mpi-
программ можно использовать опции, характерные только для команды
mpicc (они понадобятся для более сложных приложений). Например, с
помощью опции –help можно просмотреть справочнуюинформацию по
использованию mpicc.
Запуск задания на выполнение осуществляется с использованием
планировщика заданий LoadLeveler. Для обращения к планировщику по
постановке mpi-программ используется команда (скрипт) mpisubmit:
mpisubmit [<параметры mpisubmit>] <имя задачи – название
исполняемого файла> [<параметры задачи>]
(параметры, заключенные в [] не являются обязательными).
Параметры mpisubmit:
кл Наименован Значение по Примечание
юч ие умолчанию
-w лимит 10 минут предполагаемое
счетного времени время счета задания в
формате чч:мм:сс или сс,
или мм:сс;
-n число 1 требуемое число
процессоров процессоров,
максимально 16
- почтовый <username>@regatt На данный адрес
m адрес a.cmc.msu.ru будет послана
информация по
завершению задачи
- файл для Имя_задания.nnnn.o в каталог, из
stdout потока вывода ut которого происходила
постановка задания в
очередь.
- файл для имя_задания.nnnn.e в каталог, из
stderr потока ошибок rr которого происходила
постановка задания в
очередь.
- файл для
stdin потока ввода
Чтобы поставить нашу задачу в очередь на выполнение, скажем,
на 8 процессорах и с максимальным временем выполнения 1 минута,
необходимо выполнить команду
mpisubmit –w 01:00 –n 8 hello
Каждому заданию планировщик присваивает уникальное имя
regatta.nnnn.0, где nnnn - номер задания.
При наличии достаточного числа свободных процессоров задание
начнет выполняться. После постановки на счет задание будет
выполняться не больше указанного времени, если оно не успеет
завершит
Задания делятся по заказанному времени работы на классы
(разделение задач на классы может меняться по усмотрению
администраторов):
short – задания, заказанное время которых не превосходит 5
минут;
test_ - задания продолжительностью от 5 до 31 минуты для
проведения коротких тестовых расчетов;
night - задания продолжительности до 12 часов;
long_ – задания большей продолжительности.
short имеет приоритет перед заданиями test_, test_ - перед
заданиями night, задания класса night – перед классом long_ . Если в
очереди возникает задание более высокого приоритета, оно начинает
выполняться, а задание с более низким приоритетом переходит в режим
ожидания.
Если в момент постановки задачи в очередь в системе есть
выполняющиеся “длинные” задачи, то лучше сделать свою задачу
наиболее приоритетной, задав при запуске маленькое время
выполнения (если, конечно, эта задача не требует большого
процессорного времени). Также по возможности при запуске лучше
заказывать то число процессоров, которое в данный момент доступно
(бывают ситуации, когда несколько процессоров не заняты ни одной
задачей и простаивают) – в этом случае не потребуется
приостанавливать задачи, уже выполняющиеся в системе.
Дополнительные возможности управления очередью.
Просмотр состояния очереди
Для просмотра состояния очереди используется команда llq.
Команда выводит на экран текущее состояние очереди. Для
каждого задания выводится идентификатор задания (Id), имя владельца
(Owner), дата постановки в очередь или запуска (если задача уже
стартовала) (Submitted), текущий статус (ST), класс задания (Class),
заказанное пользователем время (Time Limit), остаток времени счета
(Time Left), заказанное пользователем число процессоров (CPU). Сейчас
статус (ST) может принимать следующие значения (значения статуса
также могут меняться по усмотрению администраторов):
R (Run) -- задание выполняется в данный момент;
ST (Starting) -- задание запускается, производиться
предварительная работа;
I (Idle) -- задание ожидает своей очереди на запуск;
E ( Pending ) -- задание временно приостановлено, потребовались
ресурсы для задания из более приоритеного класса.
Более подробную информацию можно получить по команде
llq -l
(выведется подробная информация по всем
задачам,находящимся в системе)
Для конкретной задачи подробную информацию можно
просмотреть с помощью команды
llq -l <id задачи>
(id задачи см. в колонке Id команды llq)
Причину, по которой задание не ставится на выполнение,
выясняют по команде
llq -s <id задания>

Удаление задания из очереди


Для того, чтобы удалить задание из очереди или снять его со
счёта, нужно воспользоваться командой
llcancel <id задания>
Например,
llcancel regatta.internal.77581
Команда
llcancel -u $USER
удаляет из очереди все задания определённого пользователя.
Например, команда
llcancel -u ivanov
завершит все задачи пользователя ivanov (только в том случае,
если у вызывающего команду есть права завершать задачи
пользователя vera).
Пример
Протокола работы пользователя на системе Regatta.
(www.regatta.cs.msu.su)

На локальной машине рекомендуется открыть 2 окна: одно для


работы на удаленной машине (Регата), второе – для выполнения
необходимых действий на локальной машине.
1. На локальной машине выполняется
ssh –X ivanov@regatta.cs.msu.su
В случае успешного выполнения команды в данном окне будет
выполняться работа с удаленной машиной.
2. На локальной машине, для этого надо перейти в другое
окно, открытое для ЛОКАЛЬНОЙ машины, выполняется
копирование файла на удаленную машину.
scp hello.c ivanov@regatta.cs.msu.su:/~ivanov/hello.c

3. На удаленной машине (Регата) вызов компилятора:


mpicc –o hello hello.c
В случае ошибок исправление текста программы, используя
текстовые редакторы vi, emacs, xedit и т.п. и повторение компиляции.
4. Постановка программы в очередь на выполнение
mpisubmit –w 01:00 –n 8 hello
5. Просмотр состояния очереди
llq
По завершению выполнения программы просмотр файла
результата.
6. Для сохранения результата на локальной машине
необходимо выполнить
scp ivanov@regatta.cs.msu.su:~/res.txt .

Использованы справочные материалы операционных систем AIX и


LINUX, установленных на Regatta и Hill, а также информация сайтов
http://www.regatta.cs.msu.su/, http://www.openmp.org/
(http://www.parallel.ru/tech/tech_dev/openmp.html), http://www.mpi-forum.org/
(http://www.parallel.ru/tech/tech_dev/mpi.html).