Участник:Kisel dv/DNS алгоритм умножения матриц
Автор: Д.В.Кисель
Содержание
- 1 Свойства и структура алгоритма
- 1.1 Общее описание алгоритма
- 1.2 Математическое описание алгоритма
- 1.3 Вычислительное ядро алгоритма
- 1.4 Макроструктура алгоритма
- 1.5 Схема реализации последовательного алгоритма
- 1.6 Последовательная сложность алгоритма
- 1.7 Информационный граф
- 1.8 Ресурс параллелизма алгоритма
- 1.9 Входные и выходные данные алгоритма
- 1.10 Свойства алгоритма
- 2 Программная реализация алгоритма
- 2.1 Особенности реализации последовательного алгоритма
- 2.2 Локальность данных и вычислений
- 2.3 Возможные способы и особенности параллельной реализации алгоритма
- 2.4 Масштабируемость алгоритма и его реализации
- 2.5 Динамические характеристики и эффективность реализации алгоритма
- 2.6 Выводы для классов архитектур
- 2.7 Существующие реализации алгоритма
- 3 Литература
1 Свойства и структура алгоритма
1.1 Общее описание алгоритма
Алгоритм DNS(Dekel, Nassimi, Sahni - назван по фамилиям создателей) является одним из блочных алгоритмов решения задачи [math]C = AB[/math] перемножения двух матриц. Для данного алгоритма мы не используем какие-либо свойства матриц [math]A[/math] и [math]B[/math] . DNS основан на блочном разделении данных, его преимуществом является временная сложность [math]O(log(n))[/math] при вычислительной сложности [math]O(\frac{n^3}{log(n)})[/math] . Достигается это за счет 3d-секционирования(англ. partitioning), в отличие от альтернатив, использующих 2d-секционирование(например, алгоритм Кэннона). Тем самым, алгоритм DNS представим в виде куба, где матрицы [math]A[/math] , [math]B[/math] и матрица [math]C[/math] ортогональны друг другу[1]. Далее данное описание будет рассмотрено подробнее.
1.2 Математическое описание алгоритма
Исходные данные: матрицы [math]A[/math] и [math]B[/math] с блоками [math]A_{ij}[/math] и [math]B_{ij}[/math] , соответственно.
Вычисляемые данные: матрица [math]C[/math] с блоками [math]C_{ij}[/math]
Используемые формулы:
[math]C_{ij} = \sum_{k=0}^{m-1} A_{ik} B_{kj} \quad i \in [0, m-1], \quad j \in [0, m-1] [/math] , где [math] m \times m [/math] - количество блоков матрицы.
1.3 Вычислительное ядро алгоритма
Вычислительное ядро перемножения матриц методом DNS состоит из вычислений всех элементов блоков матрицы-результата: процедур вычислений умножения блоков матрицы [math] A [/math] на блоки матрицы [math] B [/math]
[math]\sum_{k=0}^{m-1} A_{ik} B_{kj} \quad i \in [0, m-1], \quad i \in [0, m-1] [/math]
1.4 Макроструктура алгоритма
В алгоритме используется:
[math] \cdot [/math] произведение блоков матриц [math] A [/math] и [math] B [/math]
[math]\sum_{k=1}^{n} a_{ik} b_{kj}[/math]
1.5 Схема реализации последовательного алгоритма
Обнулим матрицу [math]C[/math] , предназначенную для записи полученного результата произведения [math]C = AB[/math] . Рассмотрим блоки матриц: [math]A_{ij}, B_{ij}, C_{ij}[/math] . В цикле выполним последовательное умножение блоков матриц операндов и суммирование результатов.
[math]C_{ij} = \sum_{k=0}^{m-1} A_{ik} B_{kj} \quad i \in [0, m-1], \quad j \in [0, m-1] [/math]
В результате получаем матрицу [math]C[/math] , равную произведению матриц [math]A[/math] и [math]B[/math] .
1.6 Последовательная сложность алгоритма
Рассматриваем матрицы размером [math]n \times n[/math] , разбитые на [math]m \times m[/math] блоков размера [math]\frac{n}{m}[/math] .
Для умножение данных матриц в последовательном варианте требуется по [math] n^3 [/math] умножений и сложений.
При классификации по последовательной сложности, таким образом, алгоритм умножения матриц относится к алгоритмам с кубической сложностью.
1.7 Информационный граф
1.8 Ресурс параллелизма алгоритма
[math] \cdot [/math] Рассмотрим [math]m^3[/math] процессов, доступных для умножения двух матриц размером [math]n \times n[/math] , разбитых на [math]m \times m[/math] блоков. Представим их в виде трехмерного массива [math] m \times m \times m[/math] .
[math] \cdot [/math] Процессы именованы согласно их расположению в массиве, соответственно, вычисление произведения [math] A_{ik}B_{kj} [/math] присвоено процессу с координатами [math] [i, j, k] (0 \leq i,j,k \lt m) [/math] .
[math] \cdot [/math] После того, как каждый процесс завершил умножение, результаты процессов [math] [i, j, 0], [i, j, 1], ..., [i, j, m-1] [/math] суммируются в [math] C_{ij} [/math] . Суммирование всех [math] C_{ij} [/math] может выполняться одновременно за [math] log(m) [/math] шагов. [2]
1.9 Входные и выходные данные алгоритма
Входные данные: матрица [math]A[/math] (элементы [math]a_{ij}[/math]), матрица [math]B[/math] (элементы [math]b_{ij}[/math])).
Объём входных данных: [math]2n^2[/math]
Выходные данные: матрица [math]C[/math] (элементы [math]c_{ij}[/math]).
Объём выходных данных: [math]n^2[/math]
1.10 Свойства алгоритма
2 Программная реализация алгоритма
2.1 Особенности реализации последовательного алгоритма
2.2 Локальность данных и вычислений
2.3 Возможные способы и особенности параллельной реализации алгоритма
2.4 Масштабируемость алгоритма и его реализации
2.5 Динамические характеристики и эффективность реализации алгоритма
2.6 Выводы для классов архитектур
2.7 Существующие реализации алгоритма
DNS алгоритм не очень распространен в Интернете, сравнительно просто отыскать лишь текстовое описание данного способа умножения матриц. Чуть более трудной, однако выполнимой задачей будет нахождение его реализации, например, на github.
3 Литература
- ↑ 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.
- ↑ http://parallelcomp.uw.hu/ch08lev1sec2.html