Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
33
Добавлен:
19.04.2015
Размер:
709 Кб
Скачать

Параллельные методы решения задач линейной алгебры

 

Параллельные методы умножения матрицы на

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();

 

}

 

Соседние файлы в папке Параллельное программирование (лекции)