Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор: различия между версиями
| Строка 112: | Строка 112: | ||
=== Существующие реализации алгоритма === | === Существующие реализации алгоритма === | ||
Последовательная реализация имеется в пакете SPARSKIT, Python.Scipy | Последовательная реализация имеется в пакете SPARSKIT, Python.Scipy, Intel MKL | ||
Параллельный алгоритм реализован в библиотеке Matlab, ScaLapack | Параллельный алгоритм реализован в библиотеке Matlab, ScaLapack | ||
Версия от 11:37, 13 октября 2016
| Умножение разреженной матрицы на вектор | |
| Последовательный алгоритм | |
| Последовательная сложность | [math]\displaystyle{ nnz }[/math] |
| Объём входных данных | [math]\displaystyle{ 2nnz+2n+1 }[/math] |
| Объём выходных данных | [math]\displaystyle{ n }[/math] |
| Параллельный алгоритм | |
| Высота ярусно-параллельной формы | [math]\displaystyle{ }[/math] |
| Ширина ярусно-параллельной формы | [math]\displaystyle{ }[/math] |
Авторы статьи: Третьякова Р. М. (группа 603), Буторина Е. В. (группа 603)
Свойства и структура алгоритма
Общее описание алгоритма
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной. Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных. При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.
Математическое описание алгоритма
Исходные данные: разреженная матрица [math]\displaystyle{ M^{n*n} }[/math], вектор [math]\displaystyle{ x^{n*1} }[/math]
Наиболее удобным форматом для вычисления произведения матрицы на вектор является "Compressed Sparse Row" или сокращенно CSR-формат.
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно [math]\displaystyle{ nnz }[/math] CSR-формат представляет матрицу [math]\displaystyle{ M }[/math] в виде 3-х одномерных массивов:
массив [math]\displaystyle{ A }[/math] размера [math]\displaystyle{ nnz }[/math] содержит ненулевые значения матрицы, [math]\displaystyle{ JA }[/math] размера [math]\displaystyle{ nnz }[/math] - номера столбцов ненулевых элементов., [math]\displaystyle{ IA }[/math] размера [math]\displaystyle{ n }[/math]- содержит номер с которого начинается описание элементов строки в массивах [math]\displaystyle{ A }[/math] и [math]\displaystyle{ JA }[/math]. Этот формат позволяет производить перемножение матрицы [math]\displaystyle{ M }[/math] на вектор [math]\displaystyle{ x }[/math] за [math]\displaystyle{ O(nnz) }[/math] умножений и сложений.
Например, это разреженная матрица с 4-мя ненулевыми элементами
- [math]\displaystyle{ \begin{pmatrix} 0 & 0 & 0 & 1 \\ 2 & 0 & 0 & 0 \\ 0 & 0 & 3 & 0 \\ 0 & 4 & 0 & 0 \\ \end{pmatrix} }[/math],
представляемая в формате CSR A = [ 1 2 3 4 ] IA = [ 0 1 2 3 4 ] JA = [ 3 0 2 1 ]
Вычисляемые данные: вектор [math]\displaystyle{ M*x=y }[/math]
Вычислительное ядро алгоритма
- [math]\displaystyle{ y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k} }[/math]
Макроструктура алгоритма
Псевдокод алгоритма:
Входные данные:
число строк матрицы n;
разреженная матрица в формате CSR:
строчные указатели IA,
столбцовые указателиJA,
ненулевые элементы A;
вектор x.
Выходные данные: произведение матрицы на вектор y.
read CSR n, IA, JA, A;
read x
for i = 1,n:
for k = IA(i), IA(i+1)-1:
y(i) += A(k)*x(JA(k));
write y;
Схема реализации последовательного алгоритма
Метод можно описать следующим образом:
- привести матрицу [math]\displaystyle{ M }[/math] к формату CSR
- для [math]\displaystyle{ i }[/math] от [math]\displaystyle{ 0 }[/math] до [math]\displaystyle{ n-1 }[/math] вычислить [math]\displaystyle{ y_i }[/math] по формуле [math]\displaystyle{ y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k} }[/math]
Последовательная сложность алгоритма
Для вычисления матрично-векторного произведения матрицы размера [math]\displaystyle{ n*n }[/math] и вектора размера n в последовательном варианте требуется:
- [math]\displaystyle{ nnz }[/math] сложений,
- [math]\displaystyle{ nnz }[/math] умножений.
Информационный граф
Ресурс параллелизма алгоритма
Входные и выходные данные алгоритма
Входные данные:
число строк матрицы n;
разреженная матрица в формате CSR:
строчные указатели IA,
столбцовые указателиJA,
ненулевые элементы A;
вектор x.
Выходные данные: произведение матрицы на вектор y.
Свойства алгоритма
Программная реализация алгоритма
Особенности реализации последовательного алгоритма
Локальность данных и вычислений
Возможные способы и особенности параллельной реализации алгоритма
Масштабируемость алгоритма и его реализации
Динамические характеристики и эффективность реализации алгоритма
Выводы для классов архитектур
Существующие реализации алгоритма
Последовательная реализация имеется в пакете SPARSKIT, Python.Scipy, Intel MKL
Параллельный алгоритм реализован в библиотеке Matlab, ScaLapack
Литература
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.