Участник:Diana Pimenova/Алгоритм Фокса умножения матриц: различия между версиями

Материал из Алговики
Перейти к навигации Перейти к поиску
Строка 61: Строка 61:


== Информационный граф ==
== Информационный граф ==
Сначала опишем идею параллельного умножения матриц методом Фокса:
* Каждой подзадаче <math>(i,j)</math> передаются блоки <math>A_{ij}</math>, <math>B_{ij}</math> и обнуляются блоки <math>C_{ij}</math> на всех подзадачах.
* Для каждой строки <math>i</math>  блок <math>A_{ij}</math> подзадачи <math>(i,j)</math> пересылается на все подзадачи той же строки <math>i</math> решетки.
* Полученные в результаты пересылок блоки <math>A'_{ij}</math>, <math>B'_{ij}</math> каждой подзадачи <math>(i,j)</math> перемножаются и прибавляются к блоку <math>C_{ij}</math><math>: C_{ij} = C_{ij} + A'_{ij}B'_{ij} </math>.
* блоки <math>B'_{ij}</math> каждой подзадачи <math>(i,j)</math> пересылаются подзадачам, являющимися соседями сверху в столбцах решетки подзадач (блоки подзадач из первой строки решетки пересылаются подзадачам последней строки решетки).


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

Версия от 09:26, 4 ноября 2017

Автор: Д.В.Пименова

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

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

Метод Фокса - это блочный алгоритм умножения квадратных матриц. Основная его идея заключается в том, что матрицы разбиваются на части, представляющие собой подматрицы исходных матриц (разделяются как матрицы-операнды, так и результирующая). При таком разбиении данных для определения базовых подзадач за основу берутся вычисления, выполняемые над блоками. А базовой подзадачей является процедура вычисления всех элементов одного из блоков результирующей матрицы. В отличие от стандартного ленточного алгоритма, когда мы рассматриваем матрицы в виде набора строк и столбцов, такой подход хранения позволяет добиться большей локализации данных и повысить эффективность использования кэш-памяти, что дает нам уменьшение времени работы программы.[1]

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

Исходные данные: квадратная матрица [math]\displaystyle{ A }[/math] (состоит из блоков [math]\displaystyle{ A_{ij} }[/math]), квадратная матрица [math]\displaystyle{ B }[/math] (состоит из блоков [math]\displaystyle{ B_{ij} }[/math]).

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

При этом каждый блок [math]\displaystyle{ C_{ij} }[/math] определяется как произведение соответствующих блоков матриц [math]\displaystyle{ A }[/math] и [math]\displaystyle{ B }[/math] :

[math]\displaystyle{ \begin{align} C_{ij} = \sum_{s = 0}^{q-1} A_{is} B_{sj}, \quad i \in [0, q-1],\quad j \in [0, q-1]. \end{align} }[/math]


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

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

[math]\displaystyle{ \begin{align} \sum_{s = 0}^{q-1} A_{is} B_{sj}, \quad i \in [0, q-1],\quad j \in [0, q-1]. \end{align} }[/math]

[2]

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

Как уже записано в описании ядра алгоритма, основную часть умножения матриц составляют множественные вычисления произведения блоков матрицы [math]\displaystyle{ A }[/math] на блоки матрицы [math]\displaystyle{ B }[/math]. Перемножать блоки будем стандартным методом, используя определение произведения матриц:

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


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

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

[math]\displaystyle{ \begin{align} С_{ij} = \sum_{s = 0}^{q-1} A_{is} B_{sj}, \quad i \in [0, q-1],\quad j \in [0, q-1]. \end{align} }[/math]

После завершения цикла мы получим матрицу с блоками [math]\displaystyle{ C_{ij} }[/math], соответствующую произведению [math]\displaystyle{ AB }[/math].[3]


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

Рассмотрим квадратные матрицы размером [math]\displaystyle{ n \times n }[/math] , разбитые на блоки размера [math]\displaystyle{ \frac{n}{q} }[/math] . Итого у нас получается [math]\displaystyle{ q \times q }[/math]  блоков.

Для умножение данных матриц в последовательном варианте требуется по [math]\displaystyle{ n^3 }[/math]  умножений и сложений.

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

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

Сначала опишем идею параллельного умножения матриц методом Фокса:

  • Каждой подзадаче [math]\displaystyle{ (i,j) }[/math] передаются блоки [math]\displaystyle{ A_{ij} }[/math], [math]\displaystyle{ B_{ij} }[/math] и обнуляются блоки [math]\displaystyle{ C_{ij} }[/math] на всех подзадачах.
  • Для каждой строки [math]\displaystyle{ i }[/math] блок [math]\displaystyle{ A_{ij} }[/math] подзадачи [math]\displaystyle{ (i,j) }[/math] пересылается на все подзадачи той же строки [math]\displaystyle{ i }[/math] решетки.
  • Полученные в результаты пересылок блоки [math]\displaystyle{ A'_{ij} }[/math], [math]\displaystyle{ B'_{ij} }[/math] каждой подзадачи [math]\displaystyle{ (i,j) }[/math] перемножаются и прибавляются к блоку [math]\displaystyle{ C_{ij} }[/math][math]\displaystyle{ : C_{ij} = C_{ij} + A'_{ij}B'_{ij} }[/math].
  • блоки [math]\displaystyle{ B'_{ij} }[/math] каждой подзадачи [math]\displaystyle{ (i,j) }[/math] пересылаются подзадачам, являющимися соседями сверху в столбцах решетки подзадач (блоки подзадач из первой строки решетки пересылаются подзадачам последней строки решетки).

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

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

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

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

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

Литература

  1. ↑ Лекции по высокопроизводительным вычислительным системам СПбГПУ, 2016.
  2. ↑ http://it.kgsu.ru/ParalAlg/palg046.html
  3. ↑ Абрамян М.Э. Лекции по основам параллельного программирования, ЮФУ, 2016.