Участник:NataliaPolienko/Блочное умножение матриц по методу Кеннона
Автор: Полиенко Н.А.
Свойства и структура алгоритма
Общее описание алгоритма
Одной из основных операций над матрицами является их перемножение. Данная операция широко применяется в большом количестве разных методов. Здесь мы рассмотрим умножение [math]\displaystyle{ C = AB }[/math] квадратных матриц с помощью алгоритма Кеннона. Его суть заключается в том, что матрицы разбиваются на блоки, представляющие собой подматрицы исходных матриц. В следствии чего в качестве базовой подзадачи можно выбрать вычисления, связанные с определением одного из блоков результирующей матрицы [math]\displaystyle{ C }[/math] [1].
Математическое описание алгоритма
Исходные данные: матрица [math]\displaystyle{ A }[/math] размера [math]\displaystyle{ n \times n }[/math], матрица [math]\displaystyle{ B }[/math] размера [math]\displaystyle{ n \times n }[/math].
Вычисляемые данные: матрица [math]\displaystyle{ C }[/math] размера [math]\displaystyle{ n \times n }[/math].
Исходные и результирующая матрицы представляются в виде наборов блоков. Операцию матричного умножения матриц [math]\displaystyle{ A }[/math] и [math]\displaystyle{ B }[/math] в блочном виде можно представить следующим образом [2]: [math]\displaystyle{ \begin{bmatrix} A_{11} & A_{12} & \cdots & A_{1k} \\ A_{21} & A_{22} & \cdots & A_{2k} \\ \vdots & \vdots & \ddots & \vdots \\ A_{k1} & A_{k2} & \cdots & A_{kk} \end{bmatrix} \begin{bmatrix} B_{11} & B_{12} & \cdots & B_{1k} \\ B_{21} & B_{22} & \cdots & B_{2k} \\ \vdots & \vdots & \ddots & \vdots \\ B_{k1} & B_{k2} & \cdots & B_{kk} \end{bmatrix} = \begin{bmatrix} C_{11} & C_{12} & \cdots & C_{1k} \\ C_{21} & C_{22} & \cdots & C_{2k} \\ \vdots & \vdots & \ddots & \vdots \\ C_{k1} & C_{k2} & \cdots & C_{kk} \end{bmatrix}, }[/math]
где каждый блок [math]\displaystyle{ C_{ij} }[/math] матрицы [math]\displaystyle{ C }[/math] определяется в соответствии с выражением:
- [math]\displaystyle{ \begin{align} C_{ij} = \sum_{l = 1}^{k} A_{il} B_{lj}, \quad i \in [1, k], \quad j \in [1, k]. \end{align} }[/math]
Полученные блоки [math]\displaystyle{ C_{ij} }[/math] являются независимыми.
Вычислительное ядро алгоритма
Вычислительное ядро перемножения матриц(квадратных) методом Кеннона можно составить из множественных вычислений умножения блоков матрицы [math]\displaystyle{ A }[/math] на блоки матрицы [math]\displaystyle{ B }[/math], таким образом получая блок результирующей матрицы [math]\displaystyle{ C }[/math]:
- [math]\displaystyle{ \begin{align} C_{ij} = \sum_{l = 1}^{k} A_{il} B_{lj}, \quad i \in [1, k], \quad j \in [1, k]. \end{align} }[/math]
Макроструктура алгоритма
Как записано в описании ядра алгоритма, основную часть метода составляют множественные вычисления умножений блоков матрицы [math]\displaystyle{ A }[/math] на блоки матрицы [math]\displaystyle{ B }[/math]:
- [math]\displaystyle{ \begin{align} \sum_{l = 1}^{k} A_{il} B_{lj}, \quad i \in [1, k], \quad j \in [1, k]. \end{align} }[/math]
Схема реализации последовательного алгоритма
Алгоритм осуществляет последовательное вычисление блоков результирующей матрицы [math]\displaystyle{ C }[/math]: 1. Матрицы [math]\displaystyle{ A }[/math], [math]\displaystyle{ B }[/math] разбиваются на блоки фиксированного размера(будем предполагать, что блоки квадратные и порядок матрицы делится на размер блока без остатка). 2. На одной итерации цикла по переменной [math]\displaystyle{ i }[/math] используется первая строка, состоящая из блоков матрицы [math]\displaystyle{ A }[/math] и все столбцы, состоящие из блоков матрицы [math]\displaystyle{ B }[/math]: [math]\displaystyle{ \begin{align} C_{ij} = \sum_{l = 1}^{k} A_{il} B_{lj}, \quad i \in [1, k], \quad j \in [1, k]. \end{align} }[/math]
Последовательная сложность алгоритма
Для перемножения матриц размера [math]\displaystyle{ n \times n }[/math] в последовательной реализации алгоритма требуется [math]\displaystyle{ n^3 }[/math] умножений и сложений.
Информационный граф
Опишем граф алгоритма[3] как аналитически, так и в виде рисунка.
Граф алгоритма умножения квадратных матриц методом Кеннона состоит из одной группы вершин, расположенной в целочисленных узлах трёхмерной области, соответствующая ей операция вычисляет функцию f, где [math]\displaystyle{ f = с+a*b }[/math].
Естественно введённые координаты области таковы:
- [math]\displaystyle{ i }[/math] — меняется в диапазоне от [math]\displaystyle{ 1 }[/math] до [math]\displaystyle{ m }[/math], принимая все целочисленные значения;
- [math]\displaystyle{ j }[/math] — меняется в диапазоне от [math]\displaystyle{ 1 }[/math] до [math]\displaystyle{ m }[/math], принимая все целочисленные значения;
- [math]\displaystyle{ k }[/math] — меняется в диапазоне от [math]\displaystyle{ 1 }[/math] до [math]\displaystyle{ m }[/math], принимая все целочисленные значения.
Аргументы операции следующие:
- [math]\displaystyle{ k = 1 }[/math]:
- [math]\displaystyle{ c = 0 }[/math];
- [math]\displaystyle{ a }[/math]: элемент входных данных, а именно блок матрицы [math]\displaystyle{ A }[/math] с координатами [math]\displaystyle{ i, j }[/math];
- [math]\displaystyle{ b }[/math] - элемент входных данных, а именно блок матрицы [math]\displaystyle{ B }[/math] с координатами [math]\displaystyle{ i, j }[/math];
- [math]\displaystyle{ k \gt 1 }[/math]:
- [math]\displaystyle{ c }[/math] - результат срабатывания операции, соответствующей вершине с координатами [math]\displaystyle{ i, j, k-1 }[/math];
- [math]\displaystyle{ a }[/math]: элемент, переданный из вершины [math]\displaystyle{ i, j+1, k-1 }[/math], являющийся элементом(блоком) матрицы [math]\displaystyle{ A }[/math];
- [math]\displaystyle{ b }[/math]: элемент, переданный из вершины [math]\displaystyle{ i+1, j, k-1 }[/math], являющийся элементом(блоком) матрицы [math]\displaystyle{ B }[/math];
При [math]\displaystyle{ k \lt m }[/math] - результатом выполнения операции является промежуточные данные алгоритма; При [math]\displaystyle{ k = m }[/math] - выходными данными алгоритма([math]\displaystyle{ C_{ij} }[/math]) будут являться результаты выполнения операции в узлах.
Описанный граф можно посмотреть на рис.1 и рис.2, выполненных для случая [math]\displaystyle{ m = 3 }[/math]([math]\displaystyle{ m }[/math] - количество блоков, на которые разбиты исходные матрицы [math]\displaystyle{ A }[/math] и [math]\displaystyle{ B }[/math] ).Здесь красными стрелками указана циклическая передача данных, соответствующих блоку матрицы [math]\displaystyle{ A }[/math], а зелеными стрелка - матрицы [math]\displaystyle{ B }[/math]. На рис.1 показан граф алгоритма согласно классическому определению , на рис.2 к графу алгоритма добавлены вершины , соответствующие входным (обозначены синим цветом) и выходным (обозначены розовым цветом) данным.


Интерактивное изображение графа алгоритма без входных и выходных данных для случая перемножения двух квадратных матриц
Ресурс параллелизма алгоритма
Для алгоритма умножения квадратных матриц методом Кеннона размера [math]\displaystyle{ n \times n }[/math] в параллельном варианте требуется последовательно выполнить следующие ярусы:
- по [math]\displaystyle{ m/k }[/math] ярусов умножений и сложений (в каждом из ярусов — [math]\displaystyle{ (m/k)^2 }[/math] операций, где [math]\displaystyle{ m/k }[/math] - количество элементов в блоке).
При этом использование режима накопления требует совершения умножений и вычитаний в режиме двойной точности, а в параллельном варианте это означает, что практически все промежуточные вычисления для выполнения алгоритма в режиме накопления должны быть двойной точности. В отличие от последовательного варианта это означает некоторое увеличение требуемой памяти.
При классификации по высоте ЯПФ, таким образом, алгоритм умножения матриц относится к алгоритмам с линейной сложностью. При классификации по ширине ЯПФ его сложность также будет квадратичной (для квадратных матриц) или билинейной (для матриц общего вида).
Входные и выходные данные алгоритма
Входные данные: матрица [math]\displaystyle{ A }[/math], матрица [math]\displaystyle{ B }[/math].
Объём входных данных: [math]\displaystyle{ n \times n + n \times n }[/math]
Выходные данные: матрица [math]\displaystyle{ C }[/math] .
Объём выходных данных: [math]\displaystyle{ n \times n }[/math]
Свойства алгоритма
Программная реализация алгоритма
Масштабируемость алгоритма и его реализации
Существующие реализации алгоритма
Литература
- ↑ http://www.math.tsu.ru/sites/default/files/mmf2/e-resources/Introduction_to_Parallel_Computations_L4(6).pdf
- ↑ http://www.intuit.ru/studies/courses/1156/190/lecture/4964?page=7
- ↑ Воеводин В.В. Математические основы параллельных вычислений// М.: Изд. Моск. ун-та, 1991. 345 с.