Участник:Kisel dv/DNS алгоритм умножения матриц: различия между версиями

Материал из Алговики
Перейти к навигации Перейти к поиску
Нет описания правки
Нет описания правки
Строка 36: Строка 36:
  C_{ij}</math>&nbsp;. В цикле выполним последовательное умножение блоков матриц операндов и суммирование результатов.
  C_{ij}</math>&nbsp;. В цикле выполним последовательное умножение блоков матриц операндов и суммирование результатов.


<math>C_{ij} = \sum_{m=0}^{n-1} A_{ik} B_{kj} \quad i \in [0, m-1], \quad j \in [0, m-1]  </math>&nbsp;
<math>C_{ij} = \sum_{k=0}^{n-1} A_{ik} B_{kj} \quad i \in [0, m-1], \quad j \in [0, m-1]  </math>&nbsp;


В результате получаем матрицу <math>C</math>&nbsp;, равную произведению матриц <math>A</math>&nbsp; и <math>B</math>&nbsp;.
В результате получаем матрицу <math>C</math>&nbsp;, равную произведению матриц <math>A</math>&nbsp; и <math>B</math>&nbsp;.
Строка 42: Строка 42:
== Последовательная сложность алгоритма ==
== Последовательная сложность алгоритма ==


Рассматриваем матрицы размером <math>n \times n</math>&nbsp;, разбитые на <math>m \times m</math>&nbsp; блоков размера <math>\frac{n}{m}</math>&nbsp;.
Тогда сложность алгоритма


== Информационный граф ==
== Информационный граф ==
Строка 48: Строка 51:
== Ресурс параллелизма алгоритма ==
== Ресурс параллелизма алгоритма ==


<math> \cdot </math>&nbsp; Рассмотрим <math>n^3</math>&nbsp; процессов, доступных для умножения двух матриц размером <math>n \times n</math>&nbsp;. Представим их в виде трехмерного массива  
<math> \cdot </math>&nbsp; Рассмотрим <math>m^3</math>&nbsp; процессов, доступных для умножения двух матриц размером <math>n \times n</math>&nbsp;, разбитых на <math>m \times m</math>&nbsp; блоков. Представим их в виде трехмерного массива  
<math> n \times n \times n</math>&nbsp;.
<math> m \times m \times m</math>&nbsp;.


<math> \cdot </math>&nbsp; Процессы именованы согласно их расположению в массиве, соответственно, вычисление произведения <math> a_{ik}b_{kj} </math>&nbsp; присвоено процессу с координатами <math> [i, j, k] (0 \leq i,j,k < n) </math>&nbsp;.
<math> \cdot </math>&nbsp; Процессы именованы согласно их расположению в массиве, соответственно, вычисление произведения <math> A_{ik}B_{kj} </math>&nbsp; присвоено процессу с координатами <math> [i, j, k] (0 \leq i,j,k < m) </math>&nbsp;.


<math> \cdot </math>&nbsp; После того, как каждый процесс завершил умножение, результаты процессов <math> [i, j, 0], [i, j, 1], ..., [i, j, n-1] </math>&nbsp; суммируются в <math> c_{ij} </math>&nbsp;. Суммирование всех <math> c_{ij} </math>&nbsp; может выполняться одновременно за <math> log(n) </math>&nbsp; шагов. <ref>http://parallelcomp.uw.hu/ch08lev1sec2.html</ref>
<math> \cdot </math>&nbsp; После того, как каждый процесс завершил умножение, результаты процессов <math> [i, j, 0], [i, j, 1], ..., [i, j, m-1] </math>&nbsp; суммируются в <math> C_{ij} </math>&nbsp;. Суммирование всех <math> C_{ij} </math>&nbsp; может выполняться одновременно за <math> log(m) </math>&nbsp; шагов. <ref>http://parallelcomp.uw.hu/ch08lev1sec2.html</ref>


== Входные и выходные данные алгоритма ==


== Входные и выходные данные алгоритма ==
'''Входные данные''': матрица <math>A</math> (элементы <math>a_{ij}</math>), матрица <math>B</math> (элементы <math>b_{ij}</math>)).
 
'''Объём входных данных''': <math>mn+nl</math>
 
'''Выходные данные''': матрица <math>C</math> (элементы <math>c_{ij}</math>).


'''Объём выходных данных''': <math>ml</math>


== Свойства алгоритма ==
== Свойства алгоритма ==

Версия от 14:05, 24 октября 2017

Автор: Д.В.Кисель

Свойства и структура алгоритма

Общее описание алгоритма

Алгоритм DNS(Dekel, Nassimi, Sahni - назван по фамилиям создателей) является одним из блочных алгоритмов решения задачи [math]\displaystyle{ C = AB }[/math]  перемножения двух матриц. Для данного алгоритма мы не используем какие-либо свойства матриц [math]\displaystyle{ A }[/math]  и [math]\displaystyle{ B }[/math] . DNS основан на разделении промежуточных данных, его преимуществом является временная сложность [math]\displaystyle{ O(log(n)) }[/math]  при вычислительной сложности [math]\displaystyle{ O(\frac{n^3}{log(n)}) }[/math] . Достигается это за счет 3d-секционирования(англ. partitioning), в отличие от альтернатив, использующих 2d-секционирование(например, алгоритм Кэннона). Тем самым, алгоритм DNS представим в виде куба, где матрицы [math]\displaystyle{ A }[/math] , [math]\displaystyle{ B }[/math]  и матрица [math]\displaystyle{ C }[/math]  ортогональны друг другу[1]. Далее данное описание будет рассмотрено подробнее.

Математическое описание алгоритма

Исходные данные: матрицы [math]\displaystyle{ A }[/math]  и [math]\displaystyle{ B }[/math]  с элементами [math]\displaystyle{ a_{ij} }[/math]  и [math]\displaystyle{ b_{ij} }[/math] , соответственно.

Вычисляемые данные: матрица [math]\displaystyle{ C }[/math]  с блоками [math]\displaystyle{ C_{ij} }[/math] 

Используемые формулы:

[math]\displaystyle{ \sum_{k=0}^{m-1} A_{ik} B_{kj} \quad i \in [0, m-1], \quad j \in [0, m-1] }[/math] , где [math]\displaystyle{ m \times m }[/math]  - количество блоков матрицы.

Вычислительное ядро алгоритма

Вычислительное ядро перемножения матриц методом DNS состоит из вычислений всех элементов блоков матрицы-результата: процедур вычислений умножения блоков матрицы [math]\displaystyle{ A }[/math]  на блоки матрицы [math]\displaystyle{ B }[/math] 

[math]\displaystyle{ \sum_{k=0}^{m-1} A_{ik} B_{kj} \quad i \in [0, m-1], \quad i \in [0, m-1] }[/math] 


Макроструктура алгоритма

В алгоритме используется:

[math]\displaystyle{ \cdot }[/math]  произведение блоков матриц [math]\displaystyle{ A }[/math]  и [math]\displaystyle{ B }[/math] 

[math]\displaystyle{ \sum_{k=1}^{n} a_{ik} b_{kj} }[/math] 

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

Обнулим матрицу [math]\displaystyle{ C }[/math] , предназначенную для записи полученного результата произведения [math]\displaystyle{ C = AB }[/math] . Рассмотрим блоки матриц: [math]\displaystyle{ A_{ij}, B_{ij}, C_{ij} }[/math] . В цикле выполним последовательное умножение блоков матриц операндов и суммирование результатов.

[math]\displaystyle{ C_{ij} = \sum_{k=0}^{n-1} A_{ik} B_{kj} \quad i \in [0, m-1], \quad j \in [0, m-1] }[/math] 

В результате получаем матрицу [math]\displaystyle{ C }[/math] , равную произведению матриц [math]\displaystyle{ A }[/math]  и [math]\displaystyle{ B }[/math] .

Последовательная сложность алгоритма

Рассматриваем матрицы размером [math]\displaystyle{ n \times n }[/math] , разбитые на [math]\displaystyle{ m \times m }[/math]  блоков размера [math]\displaystyle{ \frac{n}{m} }[/math] .

Тогда сложность алгоритма

Информационный граф

Ресурс параллелизма алгоритма

[math]\displaystyle{ \cdot }[/math]  Рассмотрим [math]\displaystyle{ m^3 }[/math]  процессов, доступных для умножения двух матриц размером [math]\displaystyle{ n \times n }[/math] , разбитых на [math]\displaystyle{ m \times m }[/math]  блоков. Представим их в виде трехмерного массива [math]\displaystyle{ m \times m \times m }[/math] .

[math]\displaystyle{ \cdot }[/math]  Процессы именованы согласно их расположению в массиве, соответственно, вычисление произведения [math]\displaystyle{ A_{ik}B_{kj} }[/math]  присвоено процессу с координатами [math]\displaystyle{ [i, j, k] (0 \leq i,j,k \lt m) }[/math] .

[math]\displaystyle{ \cdot }[/math]  После того, как каждый процесс завершил умножение, результаты процессов [math]\displaystyle{ [i, j, 0], [i, j, 1], ..., [i, j, m-1] }[/math]  суммируются в [math]\displaystyle{ C_{ij} }[/math] . Суммирование всех [math]\displaystyle{ C_{ij} }[/math]  может выполняться одновременно за [math]\displaystyle{ log(m) }[/math]  шагов. [2]

Входные и выходные данные алгоритма

Входные данные: матрица [math]\displaystyle{ A }[/math] (элементы [math]\displaystyle{ a_{ij} }[/math]), матрица [math]\displaystyle{ B }[/math] (элементы [math]\displaystyle{ b_{ij} }[/math])).

Объём входных данных: [math]\displaystyle{ mn+nl }[/math]

Выходные данные: матрица [math]\displaystyle{ C }[/math] (элементы [math]\displaystyle{ c_{ij} }[/math]).

Объём выходных данных: [math]\displaystyle{ ml }[/math]

Свойства алгоритма

Программная реализация алгоритма

Особенности реализации последовательного алгоритма

Локальность данных и вычислений

Возможные способы и особенности параллельной реализации алгоритма

Масштабируемость алгоритма и его реализации

Динамические характеристики и эффективность реализации алгоритма

Выводы для классов архитектур

Существующие реализации алгоритма

Литература

  1. ↑ E. Dekel, D. Nassimi, and S. Sahni, “Parallel Matrix and Graph Algorithms,” SIAM, Journal on Computing, vol. 10, no. 4, Nov. 1981, pp. 657-675.
  2. ↑ http://parallelcomp.uw.hu/ch08lev1sec2.html