- •Предпроектный анализ
- •Введение
- •Анализ кластерных технологий в контексте лабораторного практикума
- •Типы кластеров
- •Кластеры высокой доступности
- •Кластеры распределения нагрузки
- •Вычислительные кластеры
- •Системы распределенных вычислений (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.
Настройка mpich2
Необходимо создать на каждом компьютере пользователя с одинаковым именем и паролем. От имени этого пользователя будут запускаться MPI-программы.
Любое действие система MPICH выполняет от указанного имени пользователя. Для того, чтобы спрашивать имя пользователя и пароль, используется программа Wmpiregister. Проблема в том, что имя пользователя и пароль спрашиваются достаточно часто, что может вызывать раздражение. Для того, чтобы этого избежать, Wmpiregister может сохранять имя пользователя и пароль в реестре Windows. Для этого необходимо:
запустить программу wmpiregister,
ввести имя пользователя в поле Account,
ввести пароль в поле password,
нажать кнопку Register
нажать кнопку OK
Теперь при обращении к mpiexec, задания будут выполняться на всех узлах от имени этого пользователя, и вводить пароль повторно пользователю mpich2 не придётся.
Рис. 2.8. Скриншот программы wmpiregister
Создание общего сетевого ресурса
Для удобного запуска MPI-программ следует создать на одном из компьютеров общий сетевой ресурс. Для этого требуется в свойствах папки на вкладке «Доступ» (в нерусифицированной версии Windows – «Sharing») открыть доступ к папке. В этой папке будут храниться MPI-программы и выходные данные тестирующих программ.
Описание хода лабораторной работы №1 Создание mpi-программы в Visual Studio
Необходимо добавить файлы библиотеки MPICH2 в среду разработки.(Рис. 2.9, 2.10)
Рис. 2.9. Добавление заголовочных файлов mpich2 в среду разработки Visual C++.
Рис. 2.10. Добавление библиотечных файлов mpich2 в среду разработки Visual C++.
Также необходимо добавить библиотеку mpi.lib в проект, отредактировав свойства проекта (Рис. 2.11).
Рис. 2.11. Добавление библиотеки mpi.lib в проект Visual C++.
Любой участок кода, который может быть выполнен отдельно независимо от других, можно выполнять параллельно в отдельном потоке или процессе. Для демонстрации воспользуемся программой вычисляющей число Пи. Метод нахождения числа Пи заключается в численном решении интеграла:
Вычисление такого интеграла по методу прямоугольников сводится к дискретизации подынтегральной функции и суммированию площадей прямоугольников под функцией (Рис. 2.12):
Рисунок 2.12. Подынтегральная функция.
Чем выше частота дискретизации, тем точнее результат.
В нашей задаче выполнение суммирования(в листинге этот участок кода помечен бледным цветом) можно распараллелить, т.к. итерации не зависят друг от друга, а затем посчитать общую сумму результатов всех процессов.
Программа при запуске запрашивает у пользователя в интерактивном режиме число интервалов для суммирования – это и есть частота дискретизации(n).
Листинг программы mpi-программы
// Подключение необходимых заголовков
#include <stdio.h>
#include <math.h>
// Подключение заголовочного файла MPI
#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, pi, h, sum, x;
double startwtime = 0.0, endwtime;
int namelen;
char processor_name[MPI_MAX_PROCESSOR_NAME];
// Инициализация подсистемы MPI
MPI_Init(&argc, &argv);
// Получить размер коммуникатора MPI_COMM_WORLD
// (общее число процессов в рамках задачи)
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
// Получить номер текущего процесса в рамках
// коммуникатора MPI_COMM_WORLD
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);
while(!done)
{
// количество интервалов
if(myid==0)
{
fprintf(stdout, "Enter the number of intervals: (0 quits) ");
fflush(stdout);
if(scanf("%d",&n) != 1)
{
fprintf(stdout, "No number entered; quitting\n");
n = 0;
}
startwtime = MPI_Wtime();
}
// Рассылка количества интервалов всем процессам (в том числе и себе)
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
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);
}
mypi = h * sum;
// Сброс результатов со всех процессов и сложение
MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
// Если это главный процесс, вывод полученного результата
if(myid==0)
{
printf("PI is approximately %.16f, Error is %.16f\n", pi, fabs(pi - PI25DT));
endwtime = MPI_Wtime();
printf("wall clock time = %f\n", endwtime-startwtime);
fflush(stdout);
}
}
}
// Освобождение подсистемы MPI
MPI_Finalize();
return 0;
}