на примере простейших программ

advertisement
Инструкция по выполнению задания на ВС 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 <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
#include <stdio.h>
#include "mpi.h" // заголовочный файл mpi
main(int argc, char **argv)
{
int rank, size, tag, rc, i;
MPI_Status status;
char message[20];
“Hello, World!” на Fortran90 – MPI
program hello
C Заголовочный файл MPI
include 'mpif.h'
integer rank, size, ierror, tag, status(MPI_STATUS_SIZE)
character(12) message
C Инициализация параллельной части программы
call MPI_INIT(ierror)
// инициализация параллельной части программы
rc = MPI_Init(&argc, &argv);
// определить число процессов
rc = MPI_Comm_size(MPI_COMM_WORLD, &size);
// определить собственный номер
rc = MPI_Comm_rank(MPI_COMM_WORLD, &rank);
tag = 7; // метка передаваемого сообщения
// участок кода для процесса с номером 0
if (rank == 0)
{
strcpy(message, "Hello, world!");
// отправить сообщение всем процессам, кроме
себя
for (i = 1; i < size; i++)
rc = MPI_Send(message, 13, MPI_CHAR, i, tag,
MPI_COMM_WORLD);
}
// участок кода для процессов с номерами от 1 до
size-1
else
// принять сообщение от процесса с номером 0
rc = MPI_Recv(message, 13, MPI_CHAR, 0, tag,
MPI_COMM_WORLD, &status);
номер
// напечатать приветствие и собственный
printf("node %d : %.13s\n", rank, message);
// участок для процесса-мастера – напечатать
общее число процессов
if (rank == 0)
printf(“Number of processes = %d\n”,
size);
}
// завершение параллельной секции
rc = MPI_Finalize();
C Определить количество процессов
call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierror)
C Определить собственный номер
call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierror)
С Метка сообщения
tag = 7
C Участок кода для мастера – процесса с номером 0
if (rank .eq. 0) then
message = 'Hello, world'
do i=1, size-1, 1
C Отправить всем процессам, кроме себя, сообщение
Hello, world
call MPI_SEND(message, 12, MPI_CHARACTER,i,
tag, MPI_COMM_WORLD, ierror)
enddo
C Участок кода для процессов с номерами от 0 до size-1
else
C Принять сообщение от процесса с номером 0
call MPI_RECV(message, 12, MPI_CHARACTER, 0,
tag,MPI_COMM_WORLD, status, ierror)
endif
C Напечатать приветствие и собственный номер
print*, 'node', rank, ':', message
С Нить-мастер печатает общее количество процессов
if (rank .eq. 0) then
print*, ‘Number of processes = ’, size
endif
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:
к
люч
Наименован
ие
Значение по
умолчанию
Примечание
-
лимит
счетного времени
10 минут
предполагаемое
время счета задания в
формате чч:мм:сс или сс,
или мм:сс;
-n
число
процессоров
1
требуемое число
процессоров,
максимально 16
w
почтовый
адрес
m
-
файл для
<username>@regatt
На данный адрес
a.cmc.msu.ru
будет послана
информация по
завершению задачи
Имя_задания.nnnn.
в каталог, из
stdout
stderr
stdin
потока вывода
файл для
потока ошибок
которого происходила
постановка задания в
очередь.
out
имя_задания.nnnn.e
rr
в каталог, из
которого происходила
постановка задания в
очередь.
файл для
потока ввода
Чтобы поставить нашу задачу в очередь на выполнение, скажем,
на 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.
На локальной машине рекомендуется открыть 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).
Download