Участник:Kisel dv/DNS алгоритм умножения матриц: различия между версиями
Kisel dv (обсуждение | вклад) |
Kisel dv (обсуждение | вклад) |
||
Строка 36: | Строка 36: | ||
C_{ij}</math> . В цикле выполним последовательное умножение блоков матриц операндов и суммирование результатов. | C_{ij}</math> . В цикле выполним последовательное умножение блоков матриц операндов и суммирование результатов. | ||
− | <math>C_{ij} = \sum_{ | + | <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> |
В результате получаем матрицу <math>C</math> , равную произведению матриц <math>A</math> и <math>B</math> . | В результате получаем матрицу <math>C</math> , равную произведению матриц <math>A</math> и <math>B</math> . | ||
Строка 42: | Строка 42: | ||
== Последовательная сложность алгоритма == | == Последовательная сложность алгоритма == | ||
+ | Рассматриваем матрицы размером <math>n \times n</math> , разбитые на <math>m \times m</math> блоков размера <math>\frac{n}{m}</math> . | ||
+ | |||
+ | Тогда сложность алгоритма | ||
== Информационный граф == | == Информационный граф == | ||
Строка 48: | Строка 51: | ||
== Ресурс параллелизма алгоритма == | == Ресурс параллелизма алгоритма == | ||
− | <math> \cdot </math> Рассмотрим <math> | + | <math> \cdot </math> Рассмотрим <math>m^3</math> процессов, доступных для умножения двух матриц размером <math>n \times n</math> , разбитых на <math>m \times m</math> блоков. Представим их в виде трехмерного массива |
− | <math> | + | <math> m \times m \times m</math> . |
− | <math> \cdot </math> Процессы именованы согласно их расположению в массиве, соответственно, вычисление произведения <math> | + | <math> \cdot </math> Процессы именованы согласно их расположению в массиве, соответственно, вычисление произведения <math> A_{ik}B_{kj} </math> присвоено процессу с координатами <math> [i, j, k] (0 \leq i,j,k < m) </math> . |
− | <math> \cdot </math> После того, как каждый процесс завершил умножение, результаты процессов <math> [i, j, 0], [i, j, 1], ..., [i, j, | + | <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> шагов. <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 Общее описание алгоритма
- 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 - назван по фамилиям создателей) является одним из блочных алгоритмов решения задачи 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 Литература
- ↑ 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