- •Предпроектный анализ
- •Введение
- •Анализ кластерных технологий в контексте лабораторного практикума
- •Типы кластеров
- •Кластеры высокой доступности
- •Кластеры распределения нагрузки
- •Вычислительные кластеры
- •Системы распределенных вычислений (grid)
- •Показатели эффективности параллельного алгоритма
- •Средства разработки и поддержки параллельных приложений
- •Принципы работы среды mpich
- •Кластер миит т-4700
- •Обоснование целесообразности разработки
- •Требования к документации
- •Требования к техническому обеспечению
- •Требования к рабочим станциям
- •Требования к разрабатываемому по
- •Требования к показателям назначения
- •Анализ исходных данных
- •Разработка лабораторного комплекса «кластерные системы»
- •Разработка методического обеспечения для лабораторного комплекса
- •Содержание лабораторных работ
- •Рабочее задание для лабораторной работы №1
- •Рабочее задание для лабораторной работы №2
- •Рабочее задание для лабораторной работы №3
- •Разработка программного обеспечения для лабораторного комплекса
- •Настройка mpich2
- •Создание общего сетевого ресурса
- •Описание хода лабораторной работы №1 Создание mpi-программы в Visual Studio
- •Листинг программы mpi-программы
- •Запуск mpi-программ
- •Балансировка
- •Результаты выполнения mpi-программы
- •Построение графиков
- •Лабораторная работа №2
- •Подготовка рабочего места для выполнения лабораторной работы №2
- •Описание хода лабораторной работы №2 Подключение к кластеру миит т-4700
- •Компиляция программы
- •Листинг программы mpi-программы
- •Составление скрипта задания
- •Запуск заданий
- •Занесение данных в таблицу
- •Построение диаграмм
- •Системотехнический расчёт: расчёт показателей эффективности вычислений
- •Описание показателей эффективности параллельных вычислений
- •Описание хода лабораторной работы №3
- •Анализ человеко-машинного взаимодействия
- •Обзор теории тестовых заданий (Item response theory).
- •Процедура расчёта
- •Построение характеристических кривых для заданий
- •Обсуждение результатов и дальнейших действий
- •Экономическая часть
- •Постановка экономической задачи.
- •Расчет затрат, связанных с разработкой лабораторного комплекса.
- •Экономическая эффективность
- •Расчёт показателей эффективности
- •Расчет затрат по эксплуатации лабораторного комплекса.
- •Расчёт эффективности разработки.
- •Список источников
- •Приложения
- •Приложение 1. Листинг разработанного по
- •Листинг программы Интерфейс для mpich
- •Листинг тестирующей mpi-программы
- •Приложение 2. Инструкция по написанию и запуску заданий на кластере миит т-4700.
Листинг тестирующей mpi-программы
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include "mpi.h"
double f(double a)
{
return (4.0 / (1.0+ a*a));
}
int main(int argc, char **argv)
{
int done = 0, n, myid, numprocs, i;
double PI25DT = 3.141592653589793238462643;
double mypi[160], pi[160], perf[20], h, sum, x, maxtime=0;
double startwtime = 0.0, endwtime;
int namelen;
char processor_name[MPI_MAX_PROCESSOR_NAME];
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
MPI_Get_processor_name(processor_name,&namelen);
fprintf(stdout, "Process %d of %d is on %s\n", myid,numprocs,processor_name);
fflush(stdout);
if(myid==0)
{
fflush(stdout);
n=10000000*numprocs;
startwtime = MPI_Wtime();
}
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
double procstime=MPI_Wtime();
if(n==0)
done = 1;
else
{
h = 1.0 / (double) n;
sum = 0.0;
for(i = myid + 1 ; (i <= n) ; i += numprocs)
{
x = h * ((double)i - 0.5);
sum += f(x);
}
double procetime=MPI_Wtime();
for(i=0;i<numprocs;i++)mypi[i]=0;
mypi[myid] = procetime - procstime;
MPI_Reduce(mypi, pi, numprocs, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
if(myid==0)
{
for(int j=0;j<numprocs;j++){
printf("%.9f\n", pi[j]);
}
for(int j=0;j<numprocs;j=j+8){
perf[j/8]=(pi[j]+pi[j+1]+pi[j+2]+pi[j+3]+pi[j+4]+pi[j+5]+pi[j+6]+pi[j+7])/8;
if(maxtime<perf[j/8])maxtime=perf[j/8];
printf("%.9f\n", perf[j/8]);
}
int numhosts=numprocs/8;
FILE *of;
of=fopen(argv[1],"w");
for(int j=0;j<numhosts;j++){
int p=floor(maxtime/perf[j]*8+0.8);
printf("%d\n", p);
fprintf(of,"%d\n", p);
}
fclose(of);
endwtime = MPI_Wtime();
printf("wall clock time = %f\n", endwtime-startwtime);
fflush(stdout);
}
}
MPI_Finalize();
return 0;
}
Приложение 2. Инструкция по написанию и запуску заданий на кластере миит т-4700.
Для запуска задач на вычислительном кластере МИИТ Т-4700 необходимо пользоваться менеджером распределённых ресурсов Torque. Пользователь готовит файл задания для Torque и ставит его в очередь командой qsub. При этом пользователь запрашивает необходимые для этой задачи ресурсы: число узлов кластера, число процессоров на каждом из них, необходимое количество оперативной памяти и время выполнения задачи.
Если запрошенные ресурсы не противоречат имеющимся настройкам кластера и очереди (т.е., не было запрошено, например, больше процессоров, чем их физически есть), задание будет поставлено в очередь. После этого, как только образуются свободные ресурсы на кластере, соответствующие запрашиваемым, Torque запустит задание.
Файл задания представляет собой командный файл, который настраивает нужные переменные среды (пути, расположение временных каталогов, файлов с данными и выходных файлов) и запускает программу пользователя.
Спецификация необходимых ресурсов может быть осуществлена в команде qsub с помощью ключей командной строки.
-l nodes=1:ppn=2 Число узлов=1, число ядер=2
-l mem=100mb Объём выделенной на задание памяти = 100mb
-l walltime=1:30:00 Время выполнения задания
-q single Название очереди для задания
-o sleep.out Название файла для стандартного вывода
-e sleep.err Название файла для вывода ошибок
Например, чтобы поставить в очередь под названием single задачу sleep.job на один процессор, на полтора часа, используя сто мегабайт памяти, нужно выполнить такую команду:
qsub -l nodes=1:ppn=1,mem=100mb,walltime=1:30:00 -q single sleep.job
Еще одна возможность задания ресурсов – это указание их внутри самого командного файла, в строках-комментариях начинающихся с #PBS. Например, файл sleep.job, который описывает задание, похожее на приведённое выше, может выглядеть следующим образом:
#!/bin/bash
#PBS -q single
#PBS -l nodes=1:ppn=1,mem=100mb,walltime=1:30:00
#PBS -S /bin/bash
#PBS -o sleep.out
#PBS -e sleep.err
#PBS -N sleep
echo " Start date:`date`"
sleep 10
echo " End date:`date`"
В таком случае задание запускается просто как qsub sleep.job. В отличие предыдущего задания, у этого будет sleep, а стандартный вывод и вывод ошибок будут помещены в файлы sleep.out и sleep.err соответственно. С помощью оператора echo можно также поместить в выходной файл желаемые данные. В нашем примере после выполнения задания в sleep.out будет выведено:
Start date:<текущая дата>
End date:<текущая дата>
Полный список параметров и ресурсов для qsub можно найти c помощью man qsub и man pbs_resources.
После того, как задание успешно поставлено в очередь, ему присваивается уникальный идентификатор задачи (Job ID). Используя этот номер, можно манипулировать заданием в очереди:
- qstat Посмотреть состояние очереди;
- qdel Удалить задание из очереди;
- qalter Изменить параметры уже запущенного задания;
- qrerun Перезапустить задание, если это возможно;
- qhold Приостановить задание;
- qrls Запустить приостановленное задание.
Каждая из этих команд имеет множество параметров, ознакомиться с которыми пользователь может при помощи команды man <имя команды>, например man qstat.
Если задание было успешно поставлено в очередь, qstat по умолчанию выведет на экран таблицу, столбцы которой имеют следующие значения:
Job id - уникальный идентификатор задания;
Name - имя исполняемого задания;
User - имя владельца задания;
Time Use - общее процессорное время, использованное заданием на данный момент
S - состояние задачи (Q - находится в очереди, R – вычисляется, E - произошла ошибка при выполнении или задание завершает выполнение);
Queue - название очереди, в которой запущена задание.
Пример запуска команды qstat:
Job id Name User Time Use S Queue
------------------- ---------------- --------------- -------- - -----
1972.master PCGAMESS davydovk 00:00:00 R single
1993.master cpi-mpirun kruchin 00:00:00 R para
1994.master dl chepasov 0 Q para