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

Материал из Алговики
Перейти к навигации Перейти к поиску
[непроверенная версия][непроверенная версия]
Строка 46: Строка 46:
 
</math>
 
</math>
  
После завершения цикла мы получим матрицу с блоками <math>C_{ij}</math>, соответствующую произведению <math>AB</math>.
+
После завершения цикла мы получим матрицу с блоками <math>C_{ij}</math>, соответствующую произведению <math>AB</math>.<ref>Абрамян М.Э. Лекции по основам параллельного программирования, ЮФУ, 2016.</ref>
  
 
== Последовательная сложность алгоритма ==
 
== Последовательная сложность алгоритма ==

Версия 20:39, 9 октября 2017

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}

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.[1]

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

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

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

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

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

3 Литература

  1. Абрамян М.Э. Лекции по основам параллельного программирования, ЮФУ, 2016.

1. Абрамян М.Э. Лекции по основам параллельного программирования, ЮФУ, 2016

2. Гергель В. П. Теория и практика параллельных вычислений: учебное пособие, ИНТУИТ, 2007