Уровень алгоритма

Перемножение плотных неособенных матриц (последовательный вещественный вариант): различия между версиями

Материал из Алговики
Перейти к навигации Перейти к поиску
[непроверенная версия][досмотренная версия]
(Новая страница: «== Описание свойств и структуры алгоритма == === Словесное описание алгоритма === '''Перемно…»)
 
 
(не показано 39 промежуточных версий 10 участников)
Строка 1: Строка 1:
== Описание свойств и структуры алгоритма ==
+
{{level-a}}
  
=== Словесное описание алгоритма ===
+
{{algorithm
 +
| name              = Перемножение плотных неособенных матриц
 +
| serial_complexity = <math>2mnl</math>
 +
| pf_height        = <math>n</math>
 +
| pf_width          = <math>2ml</math>
 +
| input_data        = <math>mn+nl</math>
 +
| output_data      = <math>ml</math>
 +
}}
 +
 
 +
Основные авторы описания: [[Участник:Frolov|А.В.Фролов]].
 +
 
 +
== Свойства и структура алгоритма ==
 +
 
 +
=== Общее описание алгоритма ===
  
 
'''Перемножение матриц''' - одна из базовых задач в алгоритмах линейной алгебры, широко применяется в большом количестве разных методов.
 
'''Перемножение матриц''' - одна из базовых задач в алгоритмах линейной алгебры, широко применяется в большом количестве разных методов.
Здесь мы рассмотрим умножение <math>С = </math> плотных неособенных матриц (последовательный вещественный вариант), то есть тот вариант, где никак не используются ни специальный вид матрицы, ни ассоциативные свойства операции сложения.
+
Здесь мы рассмотрим умножение <math>C = AB</math>&nbsp; плотных неособенных матриц (последовательный вещественный вариант), то есть тот вариант, где никак не используются ни специальный вид матрицы, ни ассоциативные свойства операции сложения<ref>В.В.Воеводин, Ю.А.Кузнецов. Матрицы и вычисления. М.: Наука, 1984.</ref>.
  
=== Математическое описание ===
+
=== Математическое описание алгоритма ===
  
 
Исходные данные: плотная матрица <math>A</math> (элементы <math>a_{ij}</math>), плотная матрица <math>B</math> (элементы <math>b_{ij}</math>).
 
Исходные данные: плотная матрица <math>A</math> (элементы <math>a_{ij}</math>), плотная матрица <math>B</math> (элементы <math>b_{ij}</math>).
Строка 15: Строка 28:
 
:<math>
 
:<math>
 
\begin{align}
 
\begin{align}
c_{ij} = \sum_{k = 1}^{n} a_{ik} b_{kj}, \quad i \in [1, m], \quad i \in [1, l].
+
c_{ij} = \sum_{k = 1}^{n} a_{ik} b_{kj}, \quad i \in [1, m], \quad j \in [1, l].
 
\end{align}
 
\end{align}
 
</math>
 
</math>
Строка 31: Строка 44:
 
=== Макроструктура алгоритма ===
 
=== Макроструктура алгоритма ===
  
Как уже записано в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]], основную часть умножения матрицы на вектор составляют множественные (всего <math>ml</math>) вычисления скалярных произведений строк матрицы <math>A</math> на столбцы матрицы <math>B</math>
+
Как уже записано в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]], основную часть умножения матриц составляют множественные (всего <math>ml</math>) вычисления скалярных произведений строк матрицы <math>A</math> на столбцы матрицы <math>B</math>
  
 
:<math>\sum_{k = 1}^{n} a_{ik} b_{kj}</math>  
 
:<math>\sum_{k = 1}^{n} a_{ik} b_{kj}</math>  
Строка 37: Строка 50:
 
в режиме накопления или без него.
 
в режиме накопления или без него.
  
=== Описание схемы реализации последовательного алгоритма ===
+
=== Схема реализации последовательного алгоритма ===
  
 
Для всех <math>i</math> от <math>1</math> до <math>m</math>  и для всех <math>j</math> от <math>1</math> до <math>l</math> выполняются
 
Для всех <math>i</math> от <math>1</math> до <math>m</math>  и для всех <math>j</math> от <math>1</math> до <math>l</math> выполняются
Строка 55: Строка 68:
 
* по <math>mnl</math> умножений и сложений.
 
* по <math>mnl</math> умножений и сложений.
 
   
 
   
При этом использование режима накопления требует совершения умножений и сложений в режиме двойной точности (или использования функции вроде DPROD в Фортране), что ещё больше увеличивает затраты во времени, требуемом для выполнения умножения матрицы на вектор.
+
При этом использование режима накопления требует совершения умножений и сложений в режиме двойной точности (или использования функции вроде DPROD в Фортране), что ещё больше увеличивает затраты во времени, требуемом для выполнения умножения матриц.
  
 
При классификации по последовательной сложности, таким образом, алгоритм умножения матриц относится к алгоритмам ''с кубической сложностью'' (в случае неквадратных матриц - с ''трилинейной'').
 
При классификации по последовательной сложности, таким образом, алгоритм умножения матриц относится к алгоритмам ''с кубической сложностью'' (в случае неквадратных матриц - с ''трилинейной'').
Строка 72: Строка 85:
 
Аргументы операции следующие:
 
Аргументы операции следующие:
 
*<math>a</math>:
 
*<math>a</math>:
** при <math>k = 1</math> константа <math>0.</math>;  
+
** при <math>k = 1</math> константа <math>0</math>;  
 
** при <math>k > 1</math> — результат срабатывания операции, соответствующей вершине с координатами <math>i, j, k-1</math>;
 
** при <math>k > 1</math> — результат срабатывания операции, соответствующей вершине с координатами <math>i, j, k-1</math>;
 
*<math>b</math> — элемент ''входных данных'', а именно  <math>a_{ik}</math>;
 
*<math>b</math> — элемент ''входных данных'', а именно  <math>a_{ik}</math>;
Строка 78: Строка 91:
  
 
Результат срабатывания операции является:
 
Результат срабатывания операции является:
** при <math>k < n</math> - ''промежуточным данным'' алгоритма;
+
* при <math>k < n</math> - ''промежуточным данным'' алгоритма;
** при <math>k = n</math> - выходным данным <math>c_{ij}</math>.
+
* при <math>k = n</math> - выходным данным <math>c_{ij}</math>.
 +
 
 +
[[file:Dense mtrx product.png|thumb|center|800px|Рисунок 1. Умножение плотных матриц с отображением выходных данных]]
 +
<br/>
  
=== Описание ресурса параллелизма алгоритма ===
+
<center>
 +
Интерактивное изображение графа алгоритма без входных и выходных данных для случая перемножения двух квадратных матриц порядка 3 и 4
 +
</center>
 +
 
 +
{{#widget:Algoviewer
 +
|url=mat_mul/mat_mul_3/Algo_view_matrix3.html
 +
|width=600
 +
|height=400
 +
|border=1
 +
}}
 +
 
 +
{{#widget:Algoviewer
 +
|url=mat_mul/mat_mul_4/Algo_view_matrix4.html
 +
|width=600
 +
|height=400
 +
|border=1
 +
}}
 +
 
 +
=== Ресурс параллелизма алгоритма ===
  
 
Для алгоритма умножения квадратных матриц порядка n в параллельном варианте требуется последовательно выполнить следующие ярусы:
 
Для алгоритма умножения квадратных матриц порядка n в параллельном варианте требуется последовательно выполнить следующие ярусы:
Строка 93: Строка 127:
 
При этом использование режима накопления требует совершения умножений и вычитаний в режиме двойной точности, а в параллельном варианте это означает, что практически все промежуточные вычисления для выполнения алгоритма в режиме накопления должны быть двойной точности. В отличие от последовательного варианта это означает некоторое увеличение требуемой памяти.
 
При этом использование режима накопления требует совершения умножений и вычитаний в режиме двойной точности, а в параллельном варианте это означает, что практически все промежуточные вычисления для выполнения алгоритма в режиме накопления должны быть двойной точности. В отличие от последовательного варианта это означает некоторое увеличение требуемой памяти.
  
При классификации по высоте ЯПФ, таким образом, алгоритм умножения матрицы на вектор относится к алгоритмам ''с линейной сложностью''. При классификации по ширине ЯПФ его сложность также будет ''квадратичной'' (для квадратных матриц) или ''билинейной'' (для матриц общего вида).
+
При классификации по высоте ЯПФ, таким образом, алгоритм умножения матриц относится к алгоритмам ''с линейной сложностью''. При классификации по ширине ЯПФ его сложность также будет ''квадратичной'' (для квадратных матриц) или ''билинейной'' (для матриц общего вида).
  
=== Описание входных и выходных данных ===
+
=== Входные и выходные данные алгоритма ===
  
'''Входные данные''': матрица <math>A</math> (элементы <math>a_{ij}</math>), матрица <math>B</math> (элементы <math>b_{ij}</math>)</math>).
+
'''Входные данные''': матрица <math>A</math> (элементы <math>a_{ij}</math>), матрица <math>B</math> (элементы <math>b_{ij}</math>)).
  
'''Объём входных данных''': <math>mn+nl</math> .
+
'''Объём входных данных''': <math>mn+nl</math>  
  
 
'''Выходные данные''': матрица <math>C</math> (элементы <math>c_{ij}</math>).
 
'''Выходные данные''': матрица <math>C</math> (элементы <math>c_{ij}</math>).
  
'''Объём выходных данных''': <math>ml</math>.
+
'''Объём выходных данных''': <math>ml</math>
  
 
=== Свойства алгоритма ===
 
=== Свойства алгоритма ===
Строка 111: Строка 145:
 
При этом вычислительная мощность алгоритма умножения матриц, как отношение числа операций к суммарному объему входных и выходных данных – ''линейно''.
 
При этом вычислительная мощность алгоритма умножения матриц, как отношение числа операций к суммарному объему входных и выходных данных – ''линейно''.
  
При этом алгоритм умножения матрицы на вектор полностью детерминирован. Использование другого порядка выполнения ассоциативных операций в данной версии нами не рассматривается.
+
При этом алгоритм умножения матриц полностью детерминирован. Использование другого порядка выполнения ассоциативных операций в данной версии нами не рассматривается.
  
== Программная реализация ==
+
== Программная реализация алгоритма ==
  
 
=== Особенности реализации последовательного алгоритма ===
 
=== Особенности реализации последовательного алгоритма ===
Строка 133: Строка 167:
 
При этом для реализации режима накопления переменная <math>S</math> должна быть двойной точности.
 
При этом для реализации режима накопления переменная <math>S</math> должна быть двойной точности.
  
=== Описание локальности данных и вычислений ===
+
=== Возможные способы и особенности параллельной реализации алгоритма ===
 
+
=== Результаты прогонов ===
==== Описание локальности алгоритма ====
 
 
 
==== Описание локальности реализации алгоритма ====
 
 
 
===== Описание структуры обращений в память и качественная оценка локальности =====
 
 
 
 
 
===== Количественная оценка локальности =====
 
 
 
=== Возможные способы и особенности реализации параллельного алгоритма ===
 
 
 
 
 
=== Масштабируемость алгоритма и его реализации ===
 
 
 
==== Описание масштабируемости алгоритма ====
 
 
 
==== Описание масштабируемости реализации алгоритма ====
 
 
 
=== Динамические характеристики и эффективность реализации алгоритма ===
 
 
 
 
=== Выводы для классов архитектур ===
 
=== Выводы для классов архитектур ===
  
 +
== Литература ==
  
 +
<references />
  
=== Существующие реализации алгоритма ===
+
[[Категория:Законченные статьи]]
 
+
[[Категория:Матричные операции]]
== Литература ==
 
  
# В.В.Воеводин, Ю.А.Кузнецов. Матрицы и вычисления. М.: Наука, 1984.
+
[[En:Dense matrix multiplication (serial version for real matrices)]]

Текущая версия на 16:21, 19 февраля 2025




Перемножение плотных неособенных матриц
Последовательный алгоритм
Последовательная сложность 2mnl
Объём входных данных mn+nl
Объём выходных данных ml
Параллельный алгоритм
Высота ярусно-параллельной формы n
Ширина ярусно-параллельной формы 2ml


Основные авторы описания: А.В.Фролов.

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

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

Перемножение матриц - одна из базовых задач в алгоритмах линейной алгебры, широко применяется в большом количестве разных методов. Здесь мы рассмотрим умножение C = AB  плотных неособенных матриц (последовательный вещественный вариант), то есть тот вариант, где никак не используются ни специальный вид матрицы, ни ассоциативные свойства операции сложения[1].

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

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

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

Формулы метода:

\begin{align} c_{ij} = \sum_{k = 1}^{n} a_{ik} b_{kj}, \quad i \in [1, m], \quad j \in [1, l]. \end{align}

Существует также блочная версия метода, однако в данном описании разобран только точечный метод.

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

Вычислительное ядро перемножения плотных неособенных матриц можно составить из множественных (всего их l) вычислений умножения матрицы A на столбцы матрицы B, или (при более детальном рассмотрении), из множественных (всего их ml) скалярных произведений строк матрицы A на столбцы матрицы B:

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

в режиме накопления или без него, в зависимости от требований задачи.

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

Как уже записано в описании ядра алгоритма, основную часть умножения матриц составляют множественные (всего ml) вычисления скалярных произведений строк матрицы A на столбцы матрицы B

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

в режиме накопления или без него.

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

Для всех i от 1 до m и для всех j от 1 до l выполняются

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

Особо отметим, что вычисления сумм вида \sum_{k = 1}^{n} a_{ik} b_{kj} производят в режиме накопления прибавлением к текущему (временному) значению вычисляемого элемента матрицы c_{ij} произведений a_{ik} b_{kj} для k от 1 до n, c возрастанием k, вначале все элементы инициализируются нулями. При суммировании "по убыванию" общая схема принципиально не отличается и потому нами не рассматривается. Другие порядки выполнения суммирования приводят к изменению параллельных свойств алгоритма и будут рассматриваться нами в отдельных описаниях.

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

Для умножения двух квадратных матриц порядка n (т.е. при m=n=l) в последовательном (наиболее быстром) варианте требуется:

  • по n^3 умножений и сложений.

Для умножения матрицы размером m строк на n столбцов на матрицу размером m строк на n столбцов в последовательном (наиболее быстром) варианте требуется:

  • по mnl умножений и сложений.

При этом использование режима накопления требует совершения умножений и сложений в режиме двойной точности (или использования функции вроде DPROD в Фортране), что ещё больше увеличивает затраты во времени, требуемом для выполнения умножения матриц.

При классификации по последовательной сложности, таким образом, алгоритм умножения матриц относится к алгоритмам с кубической сложностью (в случае неквадратных матриц - с трилинейной).

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

Опишем граф алгоритма как аналитически, так и в виде рисунка.

Граф алгоритма умножения плотных матриц состоит из одной группы вершин, расположенной в целочисленных узлах трёхмерной области, соответствующая ей операция a+bc.

Естественно введённые координаты области таковы:

  • i — меняется в диапазоне от 1 до m, принимая все целочисленные значения;
  • j — меняется в диапазоне от 1 до l, принимая все целочисленные значения;
  • k — меняется в диапазоне от 1 до n, принимая все целочисленные значения.

Аргументы операции следующие:

  • a:
    • при k = 1 константа 0;
    • при k \gt 1 — результат срабатывания операции, соответствующей вершине с координатами i, j, k-1;
  • b — элемент входных данных, а именно a_{ik};
  • c - элемент входных данных b_{kj};

Результат срабатывания операции является:

  • при k \lt n - промежуточным данным алгоритма;
  • при k = n - выходным данным c_{ij}.
Рисунок 1. Умножение плотных матриц с отображением выходных данных


Интерактивное изображение графа алгоритма без входных и выходных данных для случая перемножения двух квадратных матриц порядка 3 и 4

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

Для алгоритма умножения квадратных матриц порядка n в параллельном варианте требуется последовательно выполнить следующие ярусы:

  • по n ярусов умножений и сложений (в каждом из ярусов — n^2 операций).

Для умножения матрицы размером m строк на n столбцов на матрицу размером n строк на l столбцов в последовательном (наиболее быстром) варианте требуется:

  • по n ярусов умножений и сложений (в каждом из ярусов — ml операций).

При этом использование режима накопления требует совершения умножений и вычитаний в режиме двойной точности, а в параллельном варианте это означает, что практически все промежуточные вычисления для выполнения алгоритма в режиме накопления должны быть двойной точности. В отличие от последовательного варианта это означает некоторое увеличение требуемой памяти.

При классификации по высоте ЯПФ, таким образом, алгоритм умножения матриц относится к алгоритмам с линейной сложностью. При классификации по ширине ЯПФ его сложность также будет квадратичной (для квадратных матриц) или билинейной (для матриц общего вида).

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

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

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

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

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

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

Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является квадратичным или билинейным (отношение кубической или трилинейной к линейной).

При этом вычислительная мощность алгоритма умножения матриц, как отношение числа операций к суммарному объему входных и выходных данных – линейно.

При этом алгоритм умножения матриц полностью детерминирован. Использование другого порядка выполнения ассоциативных операций в данной версии нами не рассматривается.

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

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

В простейшем варианте алгоритм умножения матриц на Фортране можно записать так:

         
	DO  I = 1, M
        DO  J = 1, L
		S = 0.
		DO  K = 1, N
			S = S + DPROD(A(I,K), B(K,J))
		END DO	
	        C(I, J) = S
        END DO
	END DO

При этом для реализации режима накопления переменная S должна быть двойной точности.

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

2.3 Результаты прогонов

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

3 Литература

  1. В.В.Воеводин, Ю.А.Кузнецов. Матрицы и вычисления. М.: Наука, 1984.