Документ взят из кэша поисковой машины. Адрес оригинального документа : http://angel.cmc.msu.ru/~basrav/supercomp2010/Regatta_metodichka.doc
Дата изменения: Fri Mar 12 18:02:44 2010
Дата индексирования: Fri Feb 28 20:00:41 2014
Кодировка: koi8-r

Инструкция по выполнению задания на ВС IBM pSeries 690 Regatta
(regatta.cs.msu.su)

Вычислительная система Regatta представляет собой 16-процессорную
систему с разделяемой памятью. Система работает под управлением
операционной системы AIX v 5.2 (Unix-подобная операционная система).
Система представляет собой комплекс, состоящий из двух машин состоит из
двух машин:
1) regatta.cs.msu.su, фронтэнд. Вся связь с комплексом осуществляется
только через эту машину (по протоколу ssh). Она предназначена для
компилирования проектов и для выполнения задач, не требующих большой
вычислительной мощности (конфигурация: 2хPower4 процессора, 4 GB памяти).
2) regata2.cs.msu.su. вычислитель. Машина предназначена только для
выполнения задач поставленных в очередь на планировщике (конфигурация
16xPower4 процессора, 64GB памяти).
1. Выход на систему
ssh -X @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 | program hello |
|#include "mpi.h" // заголовочный файл mpi|C Заголовочный файл MPI |
| |include 'mpif.h' |
| |integer rank, size, ierror, tag, |
|main(int argc, char **argv) |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) |
|rc = MPI_Comm_size(MPI_COMM_WORLD, |C Определить собственный номер |
|&size); |call MPI_COMM_RANK(MPI_COMM_WORLD, rank, |
|// определить собственный номер |ierror) |
|rc = MPI_Comm_rank(MPI_COMM_WORLD, | |
|&rank); |С Метка сообщения |
| |tag = 7 |
|tag = 7; // метка передаваемого сообщения| |
| |C Участок кода для мастера - процесса с |
|// участок кода для процесса с номером 0 |номером 0 |
|if (rank == 0) |if (rank .eq. 0) then |
|{ |message = 'Hello, world' |
|strcpy(message, "Hello, world!"); |do i=1, size-1, 1 |
|// отправить сообщение всем процессам, |C Отправить всем процессам, кроме себя, |
|кроме себя |сообщение Hello, world |
|for (i = 1; i < size; i++) |call MPI_SEND(message, 12, |
|rc = MPI_Send(message, 13, MPI_CHAR, i, |MPI_CHARACTER,i, tag, MPI_COMM_WORLD, |
|tag, MPI_COMM_WORLD); |ierror) |
|} |enddo |
|// участок кода для процессов с номерами |C Участок кода для процессов с номерами |
|от 1 до size-1 |от 0 до size-1 |
|else |else |
|// принять сообщение от процесса с |C Принять сообщение от процесса с номером|
|номером 0 |0 |
|rc = MPI_Recv(message, 13, MPI_CHAR, 0, |call MPI_RECV(message, 12, MPI_CHARACTER, |
|tag, MPI_COMM_WORLD, &status); |0, tag,MPI_COMM_WORLD, status, ierror) |
| |endif |
|// напечатать приветствие и собственный | |
|номер |C Напечатать приветствие и собственный |
|printf("node %d : %.13s\n", rank, |номер |
|message); |print*, 'node', rank, ':', message |
|// участок для процесса-мастера - | |
|напечатать общее число процессов |С Нить-мастер печатает общее количество |
|if (rank == 0) |процессов |
|printf("Number of processes = %d\n", |if (rank .eq. 0) then |
|size); |print*, 'Number of processes = ', size |
| |endif |
|// завершение параллельной секции | |
|rc = MPI_Finalize(); |C Завершение параллельной секции |
|} |call MPI_FINALIZE(ierror) |
| |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 |
|-m |почтовый адрес |@regatta.cmc|На данный адрес будет |
| | |.msu.ru |послана информация по |
| | | |завершению задачи |
|-stdou|файл для потока |Имя_задания.nnnn.out |в каталог, из которого|
|t |вывода | |происходила постановка|
| | | |задания в очередь. |
|-stder|файл для потока |имя_задания.nnnn.err |в каталог, из которого|
|r |ошибок | |происходила постановка|
| | | |задания в очередь. |
|-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 команды llq)
Причину, по которой задание не ставится на выполнение, выясняют по
команде
llq -s

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

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

На локальной машине рекомендуется открыть 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).