- •Параллельные методы решения задач линейной алгебры
- •Программная реализация (MPI) – порядок по логике вызовов!
- •void ProcessInitialization (double* &pMatrix, double* &pVector,
- •// осталось распределить между процессами Size строк матрицы А
- •14void RandomDataInitialization(double* pMatrix, double* pVector, int
- •// будет выполняться каждым процессом для сбора результата
- •// вывод результатов с других процессов
- •24// освобождение памяти на всех процессах
- •25 Замечания
Параллельные методы решения задач линейной алгебры
|
Параллельные методы умножения матрицы на |
||
1 |
вектор |
||
• |
Принципы распараллеливания |
||
|
|||
|
• |
Анализ эффективности |
|
|
• |
Программная реализация |
2 |
Принципы распараллеливания |
В методах матричных вычислений повторяются одинаковые действия для разных элементов матриц
Это параллелизм по данным
Распараллеливание = распределение частей матриц между вычислительными узлами МВС
Способ разбиения на части и распределения данных определяет параллельный алгоритм решения задачи
3 |
Способы разбиения матриц |
Ленточное разбиение – каждому процессору выделяется подмножество строк или столбцов
Всего строк (столбцов) – М, процессоров - р
Предполагается, что М кратно р
Блочное разбиение – каждому процессору выделяется блок элементов (прямоугольный, связный).
Также возможны упрощающие предположения кратности
4 |
Постановка задачи |
Матрица А размерности m x n умножается на вектор b (n элементов), результат – вектор с (m элементов).
Общее количество операций (для оценки Т1):
m операций умножения строк А на b, где каждая:
n операций умножения элементов и (n – 1) операция сложения
произведений
Время выполнения последовательного алгоритма:
Т1 = m (2n – 1)
Порядок трудоемкости последовательного алгоритма:
О(mn)
5 |
Пример разбиения – ленточное по |
|
строкам |
Дополнительная задача разбиения:
дублировать или разбивать векторы b и с?
Каждый процессор хранит строку матрицы А + отдельные элементы векторов – порядок числа сохраняемых значений:
О(max(m, n))
|
Каждый процессор хранит строку матрицы А + все элементы |
|
векторов – порядок числа сохраняемых значений: |
|
О(max(m, n)) |
|
Дублирование не повышает порядок сложности по памяти |
6 |
Схема информационного |
|
взаимодействия подзадач |
7 |
Распределение подзадач по |
|
процессорам |
Количество вычислительных операций одинаково для всех подзадач.
Если p < m, то выполняется объединение подзадач,
соответствующих непрерывной последовательности строк.
Распределение объединенных подзадач по процессорам произвольно
8 |
Анализ эффективности параллельных вычислений |
Упрощенный подход:
m = n
Не учитывается коммуникационная трудоемкость
Время выполнения всех операций одинаково
Последовательный алгоритм:
Т1 = n (2n – 1)
Параллельный алгоритм: Тp = n (2n – 1)/p
Ускорение:
Sp = Т1 / Тp = p
Эффективность:
Еp = Sp/p = 1
9 |
Анализ эффективности параллельных вычислений |
Учет коммуникационной трудоемкости
модель Хокни - оценка времени передачи сообщения m байт
tпд = tн + m/R
tн - время латентности,
R - пропускная способность сети
Параллельный алгоритм (все узлы узнают результат):
Тp = tн (log2p) + top( n (2n – 1)/p) + ( n (n – 1)/p) m/R
Предположения:
Топология – полный граф
Последовательный обмен данными между узлами (на каждом шаге сообщения увеличиваются в 2 раза), число шагов = log2p
Программная реализация (MPI) – порядок по логике вызовов!
10 |
int ProcNum = |
0;//число процессов |
|
|
int ProcRank = 0;// |
ранг процесса |
|
|
void main(int |
argc, |
char* argv[]) |
|
{ |
|
|
double* pMatrix; // A double* pVector; // b double* pResult; // c int Size; // n double* pProcRows; double* pProcResult; int RowNum;
double t1, t2; MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &ProcNum);
MPI_Comm_rank(MPI_COMM_WORLD, &ProcRank);
if (ProcRank == 0)
11 {
printf ("Parallel matrix-vector multiplication program\n");
}
ProcessInitialization(pMatrix, pVector, pResult, pProcRows, pProcResult,
Size, RowNum); // функция для выделения памяти и инициализации
t1 = MPI_Wtime(); |
|
// распределение данных по процессам |
|
DataDistribution(pMatrix, pProcRows, pVector, |
Size, RowNum); |
ParallelResultCalculation(pProcRows, pVector, |
pProcResult, Size, |
RowNum);//Axb |
|
ResultReplication(pProcResult, pResult, Size, |
RowNum);//результат – всем |
t2 = MPI_Wtime(); |
|
TestDistribution(pMatrix, pVector, pProcRows, |
Size, RowNum, pResult, t1, t2); |
ProcessTermination(pMatrix, pVector, pResult, |
pProcRows, pProcResult); |
MPI_Finalize(); |
|
} |
|