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

Материал из Алговики
Перейти к навигации Перейти к поиску
Строка 70: Строка 70:
  
 
== Ресурс параллелизма алгоритма ==
 
== Ресурс параллелизма алгоритма ==
 +
Определим вычислительную сложность данного алгоритма. Пусть все матрицы являются квадратными размера <math>n \times n</math>&nbsp;, количество блоков по горизонтали и вертикали являются одинаковым и равным <math> q </math>&nbsp; (т.е. размер всех блоков равен <math>k \times k</math>&nbsp;, где <math>k = \frac{n}{q}</math>&nbsp;), процессоры образуют квадратную решетку и их количество равно <math>p = q^{2}</math>&nbsp;.
 +
 +
Алгоритм Фокса требует для своего выполнения <math>q</math>&nbsp; итераций, в ходе которых каждый процессор перемножает свои текущие блоки матриц <math>A</math>&nbsp; и <math>B</math>&nbsp; и прибавляет результаты умножения к текущему значению блока матрицы <math>C</math>&nbsp;. С учетом выдвинутых предположений общее количество выполняемых при этом операций будет иметь порядок <math>\frac{n^{3}}{p}</math>&nbsp;.
 +
 +
Определим количество вычислительных операций. Сложность выполнения скалярного умножения строки блока матрицы <math>A</math> на столбец блока матрицы  <math>B</math> можно оценить как<math>2\frac{n}{q} - 1</math> . Количество строк и столбцов в блоках равно <math>\frac{n}{q}</math> и, как результат, трудоемкость операции блочного умножения оказывается равной <math>\frac{\frac{n^2}{p}}{\frac{2n}{q} - 1}</math>. Для сложения блоков требуется<math>\frac{n^{2}}{p}</math>  операций.
  
 
== Входные и выходные данные алгоритма ==
 
== Входные и выходные данные алгоритма ==

Версия 13:07, 4 ноября 2017

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

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

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

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

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

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

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

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

\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}


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

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

\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}

[2]

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

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

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


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

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

\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}

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


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

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

Для умножение данных матриц в последовательном варианте требуется по n^3   умножений и сложений.

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

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

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

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

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

Определим вычислительную сложность данного алгоритма. Пусть все матрицы являются квадратными размера n \times n , количество блоков по горизонтали и вертикали являются одинаковым и равным q   (т.е. размер всех блоков равен k \times k , где k = \frac{n}{q} ), процессоры образуют квадратную решетку и их количество равно p = q^{2} .

Алгоритм Фокса требует для своего выполнения q  итераций, в ходе которых каждый процессор перемножает свои текущие блоки матриц A  и B  и прибавляет результаты умножения к текущему значению блока матрицы C . С учетом выдвинутых предположений общее количество выполняемых при этом операций будет иметь порядок \frac{n^{3}}{p} .

Определим количество вычислительных операций. Сложность выполнения скалярного умножения строки блока матрицы A на столбец блока матрицы B можно оценить как2\frac{n}{q} - 1 . Количество строк и столбцов в блоках равно \frac{n}{q} и, как результат, трудоемкость операции блочного умножения оказывается равной \frac{\frac{n^2}{p}}{\frac{2n}{q} - 1}. Для сложения блоков требуется\frac{n^{2}}{p} операций.

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

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

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

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

3 Литература

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