Участник: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>
  
 
== Свойства алгоритма ==
 
== Свойства алгоритма ==

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

\cdot   произведение блоков матриц A   и B  

\sum_{k=1}^{n} a_{ik} b_{kj} 

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

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

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

В результате получаем матрицу C , равную произведению матриц A  и B .

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

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

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

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

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

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

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

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

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

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

Объём входных данных: mn+nl

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

Объём выходных данных: ml

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

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

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

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

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

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

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

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

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

3 Литература

  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