- •Моделирование и анализ параллельных вычислений.
- •Модель вычислений в виде графа "операции – операнды".
- •Описание схемы выполнения параллельного алгоритма (модель: «операции – операнды»).
- •Определение времени выполнения параллельного алгоритма.
- •Правила разработки алгоритмов.
- •Программирование параллельных алгоритмов.
- •Технология mpi.
- •Введение в библиотеку mpich.
- •Структура параллельной программы с использованием mpi:
- •Передача/прием сообщений между отдельными процессами.
- •Использование модульной структуры.
- •Определение времени выполнения программ.
- •Контроль выполнения программ.
- •Передача данных от одного процесса всем процессам программы.
- •Передача данных от всех процессов одному процессу. Операция редукции.
- •Пример коллективного вызова (без обмена)- коллективная синхронизация.
- •Аварийное завершение параллельной программы
- •Оценка коммуникационных затрат для кластерных систем.
- •Режимы передачи данных mpi.
- •Организация неблокирующих обменов данными между процессами.
- •Одновременное выполнение передачи и приема.
- •Группа процессоров и коммутаторов.
- •Управление группами.
- •Управление коммуникаторами.
- •Показатели эффективности в параллельных алгоритмах.
- •Модельная задача – вычисление частных сумм последовательности числовых значений.
- •Последовательный алгоритм суммирования
- •Каскадная схема суммирования.
- •Каскадная схема с асимптотически ненулевой эффективностью.
- •Построение частичных сумм.
- •Оценка максимального параллелизма.
- •Закон Амдаля
- •Закон Густавсона-Барсиса
- •Анализ масштабируемости параллельных вычислений.
- •Верхняя граница времени выполнения параллельного алгоритма.
- •Факторы, влияющие на производительность, и способы ее повышения.
- •Принципы разработка параллельных алгоритмов.
- •Моделирование (использование моделей) при проектировании параллельных алгоритмов.
- •Этапы разработки параллельных алгоритмов.
- •Разделение вычислительной схемы на независимые части, на основе ее анализа.
- •Определение информационных зависимостей.
- •Масштабирование набора подзадач.
- •Распределение подзадач между процессорами.
- •Умножение матриц при ленточной схеме разделения данных.
- •Определение подзадач.
- •Выделение информационных зависимостей
- •Масштабирование и распределение подзадач по процессорам
- •Анализ эффективности
- •Параллельное решение систем линейных уравнений Алгоритм решения систем линейных уравнений методом Гаусса.
- •Итерация прямого хода алгоритма Гаусса
- •Построение параллельного алгоритма
- •Масштабирование и распределение подзадач по процессорам.
- •Анализ эффективности.
- •Параллельные методы сортировки
- •Принципы распараллеливания
- •Масштабирование параллельных вычислений
- •Пузырьковая сортировка
- •Алгоритм чет-нечетной перестановки
- •Определение подзадач и выделение информационных зависимостей
- •Масштабирование и распределение подзадач по процессорам
- •Анализ эффективности
- •Параллельные вычисления при решении задач на графах.
- •Программная реализация параллельного алгоритма Флойда:
- •Определение подзадач.
- •Анализ эффективности
- •Результаты вычислительных экспериментов для параллельного алгоритма Флойда
- •Работа pvm
- •Структура идентификатора td
- •Модель передачи сообщений
- •Настройка pvm
- •Структура каталога pvm:
- •Наиболее распространенные проблемы
- •Пример простейшей программы
- •Структура программы pvm.
- •Выводы по pvm:
- •Классификация вычислительных систем
- •Алгоритмы предварительного распределения данных (графы)
- •Режимы параллельных вычислений с общей памятью
- •Основные обозначения псевдокода
- •Распределение данных в erew
- •Параллельное программирование с использованием общей памяти
- •Многопоточное программирование
- •Спецификация posix Threads
- •Пример программы с использованием posix Threads
- •Механизмы синхронизации потоков
- •Среда Open mp
- •Основные правила:
- •Синхронизация
- •Обзор средств параллельного и распределенного программирования.
- •Литература:
Параллельные вычисления при решении задач на графах.
Модельный пример: алгоритм Флойда-Уоршелла.— алгоритм для нахождения кратчайших расстояний между всеми вершинами взвешенного графа без циклов с отрицательными весами с использованием метода динамического программирования.
G (V,U) |V|=n
Рис. 11
Пример взвешенного ориентированного графа
Известны различные способы задания графов. При малом количестве дуг в графе (т.е. m<< ) целесообразно использовать для определения графов списки, перечисляющие имеющиеся в графах дуги. Представление достаточно плотных графов, ждля которых почти все вершины соединены между собой дугами, может быть эффективно обеспечено при помощи матрицы смежности. A= ), 1≤I, j≤n, ненулевые значения элементов которой соответствуют дугам графа.
Матрица смежности для графа, рассмотренного выше
Программная реализация параллельного алгоритма Флойда:
int ProcRank; // rank of current process
int ProcNum; // number of processes
// Maximum evaluation function
int Min(int A, int B)
int Result = (A < B) ? A : B;
if ((A < 0) && (B >= 0)) Result = B;
if ((B < 0) && (A >= 0)) Result = A;
if ((A < 0) && (B < 0)) Result = -1;
return Result;
}
// Main function
int main(int argc, char* argv[]) {
int *pMatrix; ; // adjacency matrix
int Size; // size of adjacency matrix
int *pProcRows; // rows of adjacency matrix
int RowNum; // number of rows on current process
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &ProcNum);
MPI_Comm_rank (MPI_COMM_WORLD, &ProcRank);
// Data initialization
ProcessInitialization (pMatrix, pProcRows, Size, RowNum);
// Data distribituon to all processes
DataDistribution (pMatrix, pProcRows, Size, RowNum);
// The Floyd parallel algorithm
ParallelFloyd (pProcRows, Size, RowNum);
// Result collection
ResultCollection (pMatrix, pProcRows, Size, RowNum);
// Computation Termination
ProcessTermination (pMatrix, pProcRows);
MPI_Finalize();
return 0;
}
Функция Min вычисляет наименьшее среди двух целых чисел, учитывая используемый метод обозначения несуществующих дуг в матрице смежности (в рассматриваемой реализации используется значение -1).
Функция ProcessInitialization определяет исходные данные решаемой задачи (количество вершин графа), выделяет память для хранения данных и осуществляет ввод матрицы смежности (или формирует ее при помощи какого-либо датчика случайных числе) и распределяет данные между процессами.
Функция DataDistribution распределяет данные между процессами. Каждый процесс получает горизонтальную полосу исходной матрицы.
Функция ProcessTermination выполняет необходимый вывод результатов решения задачи и освобождает всю ранее выделенную память для хранения данных.
Матрица смежности вершин взвешена длинами дуг, идущими из вершины
i в j : A[i][j]
for (k=0; k<n; k++)
for (i=0; i<n; i++) Последовательный алгоритм
for (j=0; j<n; j++)
{ A[i][j]=min (A[i][j], A[i][k]+ A[k][j]); }
Определение подзадач.
Матрица изменяется в ходе выполнения алгоритма, поэтому матрицу нельзя разделить между процессорами.
В качестве подзадач можно принять цикл по i и j. Всего получается k подзадач. Но сначала надо показать, что для заданного k не меняются A[i][k], A[k][j]:
i=k
A[k][j]= min (A[k][j], A[k,k]+ A[k][j]),
т.е. A[i][j]= A[k,j] не меняется, т.к. петель нет
j=k
A[i][k]=min (A[i][k], A[k,k]+ A[i][k])
Для каждой подзадачи понадобятся: A[i][j], A[i][k],A[k][j]
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
p<< , поэтому за каждым процессором придется закреплять вычисление не одного элемента, а некоторая лента (горизонтальная или вертикальная). Тогда на каждой итерации придется передавать строку матрицы A.