Лекция 6_2019

Содержание

Слайд 2

Часть 1. Умножение матрицы на вектор

Умножение матрицы на вектор

или

Задача умножения матрицы на

Часть 1. Умножение матрицы на вектор Умножение матрицы на вектор или Задача
вектор может быть сведена к выполнению m независимых операций умножения строк матрицы A на вектор b

В основу организации параллельных вычислений может быть положен принцип распараллеливания по данным

Слайд 3

Способы распределения данных

Способы распределения данных из матрицы

горизонтальные полосы

вертикальные полосы

Чередующееся (цикличное) горизонтальное разбиение

блочное

Способы распределения данных Способы распределения данных из матрицы горизонтальные полосы вертикальные полосы
разбиение

Блочная схема

где: m – число строк матрицы А, n – размер вектора В, s – число процессоров, k – число строк в блоке, v – номер строки внутри блока, i – номер блока

 

Слайд 4

Способы распределения данных: ленточная схема

Непрерывное (последовательное) распределение

горизонтальные полосы

вертикальные полосы

Чередующееся (цикличное) горизонтальное разбиение

Способы распределения данных: ленточная схема Непрерывное (последовательное) распределение горизонтальные полосы вертикальные полосы Чередующееся (цикличное) горизонтальное разбиение

Слайд 5

Последовательный алгоритм

Для выполнения матрично-векторного умножения необходимо выполнить m операций вычисления скалярного произведения
Трудоемкость

Последовательный алгоритм Для выполнения матрично-векторного умножения необходимо выполнить m операций вычисления скалярного
вычислений имеет порядок O(mn).

// Последовательный алгоритм умножения матрицы на вектор
for ( i = 0; i < m; i++ ) {
c[i] = 0;
for ( j = 0; j < n; j++ ) {
c[i] += A[i][j]*b[j]
}
}

Базовая подзадача - минимальная задача, выполняемая всеми процессорами

Слайд 6

Алгоритм 1: ленточная схема (разбиение матрицы по строкам)

Базовая подзадача - операция скалярного

Алгоритм 1: ленточная схема (разбиение матрицы по строкам) Базовая подзадача - операция
умножения одной строки матрицы на вектор:

Базовая подзадача для выполнения вычисления должна содержать:
строку матрицы А и копию вектора b.
После завершения вычислений каждая базовая подзадача будет содержать один из элементов вектора результата c
Для объединения результатов расчетов и получения полного вектора c на каждом из процессоров вычислительной системы необходимо выполнить операцию обобщенного сбора данных

Слайд 7

Результаты вычислительных экспериментов

Результаты вычислительных экспериментов

Слайд 8

Алгоритм 2: ленточная схема (разбиение матрицы по столбцам)

Базовая подзадача - операция умножения

Алгоритм 2: ленточная схема (разбиение матрицы по столбцам) Базовая подзадача - операция
столбца матрицы А на один из элементов вектора b:

Базовая подзадача для выполнения вычисления должна содержать
i-й столбец матрицы А и i-е элементы bi и ci векторов b и с
Каждая базовая задача i выполняет умножение своего столбца матрицы А на элемент bi, в итоге в каждой подзадаче получается вектор c'(i) промежуточных результатов
Для получения элементов результирующего вектора с подзадачи должны обменяться своими промежуточными данными

Слайд 9

Схема информационного взаимодействия

Для получения элементов результирующего вектора с подзадачи должны обменяться

Схема информационного взаимодействия Для получения элементов результирующего вектора с подзадачи должны обменяться своими промежуточными данными
своими промежуточными данными

Слайд 10

Результаты вычислительных экспериментов

Результаты вычислительных экспериментов

Слайд 11

Алгоритм 3: блочная схема

Пусть:
количество процессоров p=s·q ,
количество строк матрицы является кратным

Алгоритм 3: блочная схема Пусть: количество процессоров p=s·q , количество строк матрицы
s: m=k·s
количество столбцов является кратным q: l=n·q.

Подзадачи нумеруются индексами (i, j) располагаемых в подзадачах матричных блоков
Подзадачи выполняют умножение содержащегося в них блока матрицы A на блок вектора b
После перемножения блоков матрицы A и вектора b каждая подзадача (i,j) будет содержать вектор частичных результатов c'(i,j):

Слайд 12

Алгоритм 3: блочная схема

Поэлементное суммирование векторов частичных результатов для каждой горизонтальной полосы

Алгоритм 3: блочная схема Поэлементное суммирование векторов частичных результатов для каждой горизонтальной
(редукция) блоков матрицы A позволяет получить результирующий вектор c

Слайд 13

Результаты вычислительных экспериментов

Общее количество базовых подзадач совпадает с числом процессоров p, p=s·q
Большое

Результаты вычислительных экспериментов Общее количество базовых подзадач совпадает с числом процессоров p,
количество блоков по горизонтали (s) приводит к возрастанию числа итераций в операции редукции результатов блочного умножения,
увеличение размера блочной решетки по вертикали (q) повышает объем передаваемых данных между процессорами.

Слайд 14

Сравнение алгоритмов

Сравнение алгоритмов

Слайд 15

Часть 2. Умножение матриц

Умножение матриц:

или

Задача умножения матрицы на матрицу может быть сведена

Часть 2. Умножение матриц Умножение матриц: или Задача умножения матрицы на матрицу
к выполнению m·n независимых операций умножения строк матрицы A на столбцы матрицы B

В основу организации параллельных вычислений может быть положен принцип распараллеливания по данным

Слайд 16

Последовательный базовый алгоритм

double MatrixA[Size][Size];
double MatrixB[Size][Size];
double MatrixC[Size][Size];
int i,j,k;
...
for (i=0; i for

Последовательный базовый алгоритм double MatrixA[Size][Size]; double MatrixB[Size][Size]; double MatrixC[Size][Size]; int i,j,k; ...
(j=0; j{
MatrixC[i][j] = 0;
for (k=0; k MatrixC[i][j] = MatrixC[i][j] + MatrixA[i][k]*MatrixB[k][j];
}

 

Слайд 17

Результаты вычислительных экспериментов

Эксперименты проводились на двухпроцессорном вычислитель-ном узле на базе четырех-ядерных

Результаты вычислительных экспериментов Эксперименты проводились на двухпроцессорном вычислитель-ном узле на базе четырех-ядерных
процессоров Intel Xeon E5320, 1.86 ГГц, 4 Гб RAM под управлением операционной системы Micro-soft Windows HPC Server 2008. Разработка программ проводилась в среде Microsoft Visual Studio 2008, для компиляции использовался Intel C++ Compiler 10.0 for Windows.

Сравнение времени выполнения оптимизированной и неоптимизированной версий последовательного алгоритма умножения матриц

Графики зависимости времени выполнения оптимизированной и неоптимизированной версий последовательного алгоритма

Слайд 18

Часть 2. Умножение матриц

 

×

=

 

 

 

Часть 2. Умножение матриц × =

Слайд 19

Умножение матриц

 

 

×

=

 

 

Умножение матриц × =

Слайд 20

Умножение матриц

Процесс хранит одну строку матрицы A и все столбцы матрицы B

 

Умножение матриц Процесс хранит одну строку матрицы A и все столбцы матрицы B

Слайд 21

Трудоемкость

 

 

 

 

Трудоемкость

Слайд 22

Способы распределения данных

Способы распределения данных матрицы

горизонтальные полосы

вертикальные полосы

Чередующееся (цикличное) горизонтальное разбиение

блочное разбиение

Способы распределения данных Способы распределения данных матрицы горизонтальные полосы вертикальные полосы Чередующееся

Слайд 23

Параллельный алгоритм 1: ленточная схема

Каждая подзадача содержит по одной строке матрицы А

Параллельный алгоритм 1: ленточная схема Каждая подзадача содержит по одной строке матрицы
и одному столбцу матрицы В,
На каждой итерации проводится скалярное умножение содержащихся в подзадачах строк и столбцов, что приводит к получению соответствующих элементов результирующей матрицы С,
На каждой итерации каждая подзадача i, 0≤ iПосле выполнения всех итераций алгоритма в каждой подзадаче поочередно окажутся все столбцы матрицы В.
По завершении итераций строки собираются в единую матрицу C.

Примечание. Для распределения подзадач между процессорами может быть использован любой способ, обеспечивающий эффективное представление кольцевой структуры информационного взаимодействия подзадач.

Слайд 24

Параллельный алгоритм 1: ленточная схема

Топология информационных связей подзадач в виде кольцевой структуры:

1

2

3

4

Параллельный алгоритм 1: ленточная схема Топология информационных связей подзадач в виде кольцевой

Слайд 25

Результаты вычислительных экспериментов

Результаты вычислительных экспериментов

Слайд 26

Параллельный алгоритм 1: ленточная схема

void MatrixMultiplicationMPI(double *&A, double *&B, double *&C, int

Параллельный алгоритм 1: ленточная схема void MatrixMultiplicationMPI(double *&A, double *&B, double *&C,
&Size)
{
int dim = Size; int i, j, k, p, ind;
double temp;
MPI_Status Status;
int ProcPartSize = dim/ProcNum;
int ProcPartElem = ProcPartSize*dim;
double* bufA = new double[ProcPartElem];
double* bufB = new double[ProcPartElem];
double* bufC = new double[ProcPartElem];
int ProcPart = dim/ProcNum,
part = ProcPart*dim;
if (ProcRank == 0) { Flip(B, Size); }
MPI_Scatter(A, part, MPI_DOUBLE, bufA, part, MPI_DOUBLE, 0, MPI_COMM_WORLD);
MPI_Scatter(B, part, MPI_DOUBLE, bufB, part, MPI_DOUBLE, 0, MPI_COMM_WORLD);
temp = 0.0;
for (i=0; i < ProcPartSize; i++)
{ for (j=0; j < ProcPartSize; j++)
{ for (k=0; k < dim; k++) temp += bufA[i*dim+k]*bufB[j*dim+k];
bufC[i*dim+j+ProcPartSize*ProcRank] = temp;
temp = 0.0;
}
}

Слайд 27

int NextProc;
int PrevProc;
for (p=1; p < ProcNum; p++)
{ NextProc

int NextProc; int PrevProc; for (p=1; p { NextProc = ProcRank+1; if
= ProcRank+1;
if (ProcRank == ProcNum-1) NextProc = 0;
PrevProc = ProcRank-1;
if (ProcRank == 0) PrevProc = ProcNum-1;
MPI_Sendrecv_replace(bufB, part, MPI_DOUBLE, NextProc, 0, PrevProc, 0, MPI_COMM_WORLD, &Status);
temp = 0.0;
for (i=0; i < ProcPartSize; i++)
{ for (j=0; j < ProcPartSize; j++)
{ for (k=0; k < dim; k++)
{ temp += bufA[i*dim+k]*bufB[j*dim+k];
}
if (ProcRank-p >= 0 ) ind = ProcRank-p;
else ind = (ProcNum-p+ProcRank);
bufC[i*dim+j+ind*ProcPartSize] = temp;
temp = 0.0;
}
}
}
MPI_Gather(bufC, ProcPartElem, MPI_DOUBLE, C, ProcPartElem, MPI_DOUBLE, 0, MPI_COMM_WORLD);
delete []bufA;
delete []bufB;
delete []bufC;
}

Слайд 28

Параллельный алгоритм 2: ленточная схема

Идея: распределение данных в разбиении матриц A и

Параллельный алгоритм 2: ленточная схема Идея: распределение данных в разбиении матриц A
B по строкам

Каждая подзадача содержит по одной строке матриц А и B,
На каждой итерации подзадачи выполняют поэлементное умножение векторов, в результате в каждой подзадаче получается строка частичных результатов для матрицы C,  
На каждой итерации подзадача i, 0≤ iПосле выполнения всех итераций алгоритма в каждой подзадаче поочередно окажутся все строки матрицы В

Слайд 29

Параллельный алгоритм 2: ленточная схема

Параллельный алгоритм 2: ленточная схема

Слайд 30

Параллельный алгоритм 2: ленточная схема

Алгоритм
Вначале производится рассылка в процесс ранга K элементов

Параллельный алгоритм 2: ленточная схема Алгоритм Вначале производится рассылка в процесс ранга
K-й строки матрицы A и элементов K-й строки матрицы B.
Элементы строки с, в которой будет содержаться соответствующая строка произведения AB, обнуляются.
Затем запускается цикл (число итераций равно N), в ходе которого выполняются два действия:
1) выполняется перемножение элементов строк матрицы A и матрицы B с одинаковыми номерами, и результаты добавляются к соответствующему элементу строки c;
2) выполняется циклическая пересылка строк матрицы B в соседние процессы (направление пересылки может быть произвольным: как по возрастанию рангов процессов, так и по их убыванию).
После завершения цикла в каждом процессе будет содержаться соответствующая строка произведения AB.
Останется переслать эти строки главному процессу.

Слайд 31

Результаты вычислительных экспериментов

Результаты вычислительных экспериментов

Слайд 32

Простой блочный алгоритм

Простой блочный алгоритм

Слайд 33

Простой блочный алгоритм

 

Вычисление произведения матриц в конечном поле с помощью простой параллельной

Простой блочный алгоритм Вычисление произведения матриц в конечном поле с помощью простой
схемы умножения. Коэффициент ускорения равен 77%.

Слайд 34

Метод Фокса

Распределение данных происходит по Блочной схеме

Базовая подзадача - процедура вычисления всех

Метод Фокса Распределение данных происходит по Блочной схеме Базовая подзадача - процедура
элементов одного из блоков матрицы С

Подзадача (i,j) отвечает за вычисление блока Cij, как результат, все подзадачи образуют прямоугольную решетку размером qxq,
В ходе вычислений в каждой подзадаче располагаются четыре матричных блока:
блок Cij матрицы C, вычисляемый подзадачей,
блок Aij матрицы A, размещаемый в подзадаче перед началом вычислений,
блоки A'ij, B'ij матриц A и B, получаемые подзадачей в ходе выполнения вычислений.

Слайд 35

Параллельный алгоритм 2: метод Фокса

Выделение информационных зависимостей - для каждой итерации l,

Параллельный алгоритм 2: метод Фокса Выделение информационных зависимостей - для каждой итерации
0≤ lблок Aij подзадачи (i,j) пересылается на все подзадачи той же строки i решетки; индекс j, определяющий положение подзадачи в строке, вычисляется в соответствии с выражением:
j = ( i+l ) mod q,
где mod есть операция получения остатка от целого деления;
полученные в результате пересылок блоки Aij’, Bij’ каждой подзадачи (i,j) перемножаются и прибавляются к блоку Cij
блоки Bij’ каждой подзадачи (i,j) пересылаются подзадачам, являющимися соседями сверху в столбцах решетки подзадач (блоки подзадач из первой строки решетки пересылаются подзадачам последней строки решетки).

Слайд 36

Схема информационного взаимодействия

Параллельный алгоритм 2: метод Фокса

Масштабирование и распределение подзадач по

Схема информационного взаимодействия Параллельный алгоритм 2: метод Фокса Масштабирование и распределение подзадач
процессорам
Размеры блоков могут быть подобраны таким образом, чтобы общее количество базовых подзадач совпадало с числом процессоров p,
Наиболее эффективное выполнение метода Фокса может быть обеспечено при представлении множества имеющихся процессоров в виде квадратной решетки,
В этом случае можно осуществить непосредственное отображение набора подзадач на множество процессоров - базовую подзадачу (i,j) следует располагать на процессоре pi,j

Слайд 37

Пример: метод Фокса

 

 

Итерация 1. Диагональные процессы раздают свои элементы матрицы А направо

Пример: метод Фокса Итерация 1. Диагональные процессы раздают свои элементы матрицы А
соседям, матрица В без изменений:

 

 

Слайд 38

Пример: метод Фокса

 

 

Итерация 2. Верхнедиагональные процессы раздают свои элементы матрицы А направо

Пример: метод Фокса Итерация 2. Верхнедиагональные процессы раздают свои элементы матрицы А
соседям. В матрице В строки сдвигаются циклически вверх:

 

 

 


Слайд 39

Пример: метод Фокса

х

=

Итерация 2.

Итерация 1.

Итерация 3.

Пример: метод Фокса х = Итерация 2. Итерация 1. Итерация 3.

Слайд 40

Результаты вычислительных экспериментов

Результаты вычислительных экспериментов

Слайд 41

Алгоритм Кэннона при блочном разделении данных

Базовая подзадача - процедура вычисления всех элементов

Алгоритм Кэннона при блочном разделении данных Базовая подзадача - процедура вычисления всех
одного из блоков матрицы С

Подзадача (i,j) отвечает за вычисление блока Cij, все подзадачи образуют прямоугольную решетку размером qxq,
Начальное расположение блоков в алгоритме Кэннона подбирается таким образом, чтобы располагаемые блоки в подзадачах могли бы быть перемножены без каких-либо дополнительных передач данных:
в каждую подзадачу (i,j) передаются блоки Aij, Bij,
для каждой строки i решетки подзадач блоки матрицы A сдвигаются на (i-1) позиций влево,
для каждого столбца j решетки подзадач блоки матрицы B сдвигаются на (j-1) позиций вверх,
процедуры передачи данных являются примером операции циклического сдвига

Слайд 42

Перераспределение блоков исходных матриц на начальном этапе выполнения метода

Параллельный алгоритм 3: метод

Перераспределение блоков исходных матриц на начальном этапе выполнения метода Параллельный алгоритм 3: метод Кэннона
Кэннона

Слайд 43

Пример: метод Кэннона

 

 

Итерация 1. Циклический сдвиг по строкам: 0-я строка на 0

Пример: метод Кэннона Итерация 1. Циклический сдвиг по строкам: 0-я строка на
элементов влево
1-я строка на 1 элемент влево
2-я строка на 2 элемента влево

 

 

Циклический сдвиг по столбцам: 0-й на 0 элементов вверх
1-й на 1 элемент вверх
2-й на 2 элемента вверх

 

 

 




Слайд 44

Пример: метод Фокса

х

=

Итерация 2.

Итерация 1.

Итерация 3.

Пример: метод Фокса х = Итерация 2. Итерация 1. Итерация 3.

Слайд 45

Выделение информационных зависимостей
В результате начального распределения в каждой базовой подзадаче будут располагаться

Выделение информационных зависимостей В результате начального распределения в каждой базовой подзадаче будут
блоки, которые могут быть перемножены без дополнительных операций передачи данных,
Для получения всех последующих блоков после выполнения операции блочного умножения:
каждый блок матрицы A передается предшествующей подзадаче влево по строкам решетки подзадач,
каждый блок матрицы В передается предшествующей подзадаче вверх по столбцам решетки.

Параллельный алгоритм 3: метод Кэннона

Масштабирование и распределение подзадач по процессорам
Размер блоков может быть подобран таким образом, чтобы количество базовых подзадач совпадало с числом имеющихся процессоров,
Множество имеющихся процессоров представляется в виде квадратной решетки и размещение базовых подзадач (i,j) осуществляется на процессорах pi,j (соответствующих узлов процессорной решетки)

Слайд 46

Результаты вычислительных экспериментов

Результаты вычислительных экспериментов