Участник:ZhenyaNikishkina: различия между версиями
Строка 9: | Строка 9: | ||
Основные авторы описания: [[Участник:ZhenyaNikishkina|Е.Г.Никишкина]] | Основные авторы описания: [[Участник:ZhenyaNikishkina|Е.Г.Никишкина]] | ||
− | |||
В численном анализе и научных вычислениях '''разреженная матрица''' - это матрица, в которой большинство элементов равны нулю.<ref name="Yan Wu Liu Gao 2017 p. ">Yan, Di; Wu, Tao; Liu, Ying; Gao, Yang (2017). "An efficient sparse-dense matrix multiplication on a multicore system". 2017 IEEE 17th International Conference on Communication Technology (ICCT). IEEE. pp. 1880–1883. doi:10.1109/icct.2017.8359956. ISBN 978-1-5090-3944-9.</ref> Не существует строгого определения доли элементов с нулевым значением для того, чтобы матрица считалась разреженной, но общим критерием является то, что количество ненулевых элементов примерно равно количеству строк или столбцов. Напротив, если большинство элементов ненулевые, матрица считается '''плотной'''.<ref name="Yan Wu Liu Gao 2017 p. "/> Число элементов с нулевым значением, деленное на общее количество элементов (например, ''m'' × ''n'' для матрицы ''m'' × ''n''), иногда называют '''разреженностью матрицы'''. | В численном анализе и научных вычислениях '''разреженная матрица''' - это матрица, в которой большинство элементов равны нулю.<ref name="Yan Wu Liu Gao 2017 p. ">Yan, Di; Wu, Tao; Liu, Ying; Gao, Yang (2017). "An efficient sparse-dense matrix multiplication on a multicore system". 2017 IEEE 17th International Conference on Communication Technology (ICCT). IEEE. pp. 1880–1883. doi:10.1109/icct.2017.8359956. ISBN 978-1-5090-3944-9.</ref> Не существует строгого определения доли элементов с нулевым значением для того, чтобы матрица считалась разреженной, но общим критерием является то, что количество ненулевых элементов примерно равно количеству строк или столбцов. Напротив, если большинство элементов ненулевые, матрица считается '''плотной'''.<ref name="Yan Wu Liu Gao 2017 p. "/> Число элементов с нулевым значением, деленное на общее количество элементов (например, ''m'' × ''n'' для матрицы ''m'' × ''n''), иногда называют '''разреженностью матрицы'''. | ||
Строка 18: | Строка 17: | ||
== Свойства и структура алгоритмов == | == Свойства и структура алгоритмов == | ||
+ | Пусть дана разреженная матрица <math>A</math> = | ||
+ | <math display="block">\begin{pmatrix} | ||
+ | 0 & 6 & 0 & 0 \\ | ||
+ | 4 & 0 & 0 & 0 \\ | ||
+ | 0 & 0 & 2 & 0 \\ | ||
+ | 0 & 7 & 0 & 1 \\ | ||
+ | \end{pmatrix}</math> | ||
+ | |||
Существует несколько типов хранения разреженных матриц, которые позволяют оптимально использовать память и ускорить выполнение операций. Некоторые из наиболее популярных методов хранения разреженных матриц включают: | Существует несколько типов хранения разреженных матриц, которые позволяют оптимально использовать память и ускорить выполнение операций. Некоторые из наиболее популярных методов хранения разреженных матриц включают: | ||
1. '''Список списков''' (List of Lists, LIL): В этом представлении разреженной матрицы каждая строка матрицы хранится в виде списка, содержащего пары (индекс столбца, значение). Этот формат удобен для построения и модификации разреженных матриц, но может быть неэффективным для матричных операций. | 1. '''Список списков''' (List of Lists, LIL): В этом представлении разреженной матрицы каждая строка матрицы хранится в виде списка, содержащего пары (индекс столбца, значение). Этот формат удобен для построения и модификации разреженных матриц, но может быть неэффективным для матричных операций. | ||
+ | |||
+ | LIL (List of Lists) представление будет выглядеть следующим образом: | ||
+ | <source lang="python"> | ||
+ | LIL(A) = [ | ||
+ | [(1, 6)], # ненулевой элемент в 1-й строке - 6 во 2-м столбце | ||
+ | [(0, 4)], # ненулевой элемент в 2-й строке - 4 в 1-м столбце | ||
+ | [(2, 2)], # ненулевой элемент в 3-й строке - 2 в 3-м столбце | ||
+ | [(1, 7), (3, 1)] # ненулевые элементы в 4-й строке - 7 во 2-м столбце, 1 в 4-м столбце | ||
+ | ] | ||
+ | </source> | ||
2. '''Сжатое представление по строкам''' (Compressed Sparse Row, CSR) / '''Сжатое представление по столбцам''' (Compressed Sparse Column, CSC): В CSR и CSC форматах разреженная матрица представляется с помощью трех одномерных массивов: значения (non-zero values), индексы столбцов (column indices) и указатели на начало каждой строки (row pointers) для CSR или указатели на начало каждого столбца (column pointers) для CSC. Эти форматы являются наиболее распространенными и эффективными для матричных операций, таких как сложение, умножение и транспонирование. | 2. '''Сжатое представление по строкам''' (Compressed Sparse Row, CSR) / '''Сжатое представление по столбцам''' (Compressed Sparse Column, CSC): В CSR и CSC форматах разреженная матрица представляется с помощью трех одномерных массивов: значения (non-zero values), индексы столбцов (column indices) и указатели на начало каждой строки (row pointers) для CSR или указатели на начало каждого столбца (column pointers) для CSC. Эти форматы являются наиболее распространенными и эффективными для матричных операций, таких как сложение, умножение и транспонирование. | ||
+ | |||
+ | CSR (Compressed Sparse Row) представление будет выглядеть следующим образом: | ||
+ | <source lang="python"> | ||
+ | values = [6, 4, 2, 7, 1] | ||
+ | column_indices = [1, 0, 2, 1, 3] | ||
+ | row_pointers = [0, 1, 2, 3, 5] | ||
+ | </source> | ||
+ | |||
+ | CSC (Compressed Sparse Column) представление для этой же матрицы будет таким: | ||
+ | <source lang="python"> | ||
+ | values = [4, 6, 7, 2, 1] | ||
+ | row_indices = [1, 0, 3, 2, 3] | ||
+ | column_pointers = [0, 1, 3, 4, 5] | ||
+ | </source> | ||
3. '''Координатный формат''' (COO, Coordinate List): В координатном формате каждый ненулевой элемент матрицы представляется с помощью трех значений: индекс строки, индекс столбца и значение элемента. Этот формат удобен для добавления и изучения элементов, но менее эффективен для выполнения матричных операций по сравнению с CSR и CSC. | 3. '''Координатный формат''' (COO, Coordinate List): В координатном формате каждый ненулевой элемент матрицы представляется с помощью трех значений: индекс строки, индекс столбца и значение элемента. Этот формат удобен для добавления и изучения элементов, но менее эффективен для выполнения матричных операций по сравнению с CSR и CSC. | ||
+ | |||
+ | COO (Coordinate List) представление: | ||
+ | <source lang="python"> | ||
+ | row_indices = [0, 1, 2, 3, 3] | ||
+ | column_indices = [1, 0, 2, 1, 3] | ||
+ | values = [6, 4, 2, 7, 1] | ||
+ | </source> | ||
4. '''Диагональное представление''' (DIA, Diagonal Storage): В этом формате хранятся только диагонали матрицы, содержащие хотя бы одно ненулевое значение. Это достигается путем хранения значений диагоналей в двумерном массиве и массива смещений для каждой диагонали. DIA подходит для матриц с преимущественно диагональными элементами, например, для тридиагональных матриц, встречающихся при решении уравнений методом прогонки. | 4. '''Диагональное представление''' (DIA, Diagonal Storage): В этом формате хранятся только диагонали матрицы, содержащие хотя бы одно ненулевое значение. Это достигается путем хранения значений диагоналей в двумерном массиве и массива смещений для каждой диагонали. DIA подходит для матриц с преимущественно диагональными элементами, например, для тридиагональных матриц, встречающихся при решении уравнений методом прогонки. | ||
+ | |||
+ | DIA (Diagonal Storage) представление: | ||
+ | Поскольку матрица A содержит 4 диагонали с ненулевыми элементами, DIA представление будет включать только их: | ||
+ | Диагональ с индексом 1 (диагональ выше главной): [6, 0, 0]; | ||
+ | Диагональ с индексом 0 (главная диагональ): [0, 0, 2, 1]; | ||
+ | Диагональ с индексом -1 (диагональ ниже главной): [4, 0, 0]; | ||
+ | Диагональ с индексом -2 (диагональ ниже главной): [0, 7] | ||
+ | |||
+ | <math>diagonals</math> = | ||
+ | <math display="block">\begin{pmatrix} | ||
+ | * & * & 0 & * \\ | ||
+ | * & 4 & 0 & 6 \\ | ||
+ | 0 & 0 & 2 & 0 \\ | ||
+ | 7 & 0 & 1 & 0 \\ | ||
+ | \end{pmatrix}</math> | ||
+ | |||
+ | <math>offsets</math> = [-2 -1 0 1] | ||
+ | |||
+ | Здесь <math>diagonals</math> - двумерный массив значений диагоналей матрицы <math> A</math> . Порядок следования диагоналей в массиве выбирается произвольно. <math>offsets</math> - одномерный массив, который указывает смещение каждой диагонали относительно главной диагонали. Положительные значения указывают на диагонали, расположенные выше главной, отрицательные значения - ниже главной. | ||
+ | |||
5. '''ELLPACK / ITPACK представление''' (ELLPACK / ITPACK, ELL): В ELLPACK / ITPACK формате каждая строка матрицы представлена вектором фиксированной длины, содержащим значения и индексы столбцов L наиболее длинных строк, остальные элементы дополняются нулями. Это делает этот формат легко параллелизуемым на графических процессорах, но он может быть неэффективным, если разница в количестве ненулевых элементов между самой длинной и самой короткой строками слишком велика. | 5. '''ELLPACK / ITPACK представление''' (ELLPACK / ITPACK, ELL): В ELLPACK / ITPACK формате каждая строка матрицы представлена вектором фиксированной длины, содержащим значения и индексы столбцов L наиболее длинных строк, остальные элементы дополняются нулями. Это делает этот формат легко параллелизуемым на графических процессорах, но он может быть неэффективным, если разница в количестве ненулевых элементов между самой длинной и самой короткой строками слишком велика. | ||
+ | |||
+ | ELLPACK / ITPACK (ELL) представление определяется с использованием фиксированной длины массивов для строк матрицы. В данной матрице максимальное количество ненулевых элементов в строках равно 2 (для строки 4). Будем использовать массивы длины 2. | ||
+ | |||
+ | <math>indices</math> = | ||
+ | <math display="block">\begin{pmatrix} | ||
+ | 1 & -1 \\ | ||
+ | 0 & -1 \\ | ||
+ | 2 & -1 \\ | ||
+ | 1 & 3 \\ | ||
+ | \end{pmatrix}</math> | ||
+ | |||
+ | <math>values</math> = | ||
+ | <math display="block">\begin{pmatrix} | ||
+ | 6 & 0 \\ | ||
+ | 4 & 0 \\ | ||
+ | 2 & 0 \\ | ||
+ | 7 & 1 \\ | ||
+ | \end{pmatrix}</math> | ||
+ | |||
+ | Здесь <math>indices</math> - двумерный массив, в котором каждая строка содержит индексы столбцов ненулевых элементов соответствующей строки матрицы <math>A</math>. Если количество ненулевых элементов в строке меньше, чем максимальное количество для других строк, то оставшиеся значения дополняются специальным индексом(обычно -1). <math>values</math> - двумерный массив такой же структуры, как и массив <math>indices</math>, но он содержит сами ненулевые значения элементов матрицы <math>A</math>. Если строка содержит менее максимального количества ненулевых элементов, то оставшиеся значения в строке дополняются нулями. | ||
Выбор подходящего формата хранения разреженной матрицы зависит от решаемой задачи, преимущественно используемых операций и требований к производительности. | Выбор подходящего формата хранения разреженной матрицы зависит от решаемой задачи, преимущественно используемых операций и требований к производительности. | ||
Строка 34: | Строка 112: | ||
=== Общее описание алгоритма === | === Общее описание алгоритма === | ||
− | '''Перемножение разреженных матриц''' - одна из | + | '''Перемножение разреженных матриц''' - одна из задач в алгоритмах линейной алгебры, широко применяющаяся в различных методах. |
− | Здесь мы рассмотрим умножение <math>C = AB</math> разреженных матриц (последовательный вещественный вариант), | + | Здесь мы рассмотрим умножение <math>C = AB</math> разреженных матриц (последовательный вещественный вариант), в реализации алгоритма перемножения существенно будет использовано представление матрицы. |
=== Математическое описание алгоритма === | === Математическое описание алгоритма === | ||
− | Исходные данные: | + | Исходные данные: разреженная матрица <math>A</math> (элементы <math>a_{ij}</math>), разреженная матрица <math>B</math> (элементы <math>b_{ij}</math>). |
Вычисляемые данные: плотная матрица <math>C</math> (элементы <math>c_{ij}</math>). | Вычисляемые данные: плотная матрица <math>C</math> (элементы <math>c_{ij}</math>). |
Версия 00:05, 29 октября 2023
Умножение разреженных матриц |
Основные авторы описания: Е.Г.Никишкина
В численном анализе и научных вычислениях разреженная матрица - это матрица, в которой большинство элементов равны нулю.[1] Не существует строгого определения доли элементов с нулевым значением для того, чтобы матрица считалась разреженной, но общим критерием является то, что количество ненулевых элементов примерно равно количеству строк или столбцов. Напротив, если большинство элементов ненулевые, матрица считается плотной.[1] Число элементов с нулевым значением, деленное на общее количество элементов (например, m × n для матрицы m × n), иногда называют разреженностью матрицы.
Концептуально разреженность соответствует системам с небольшим количеством попарных взаимодействий. Например, рассмотрим линию шариков, соединенных пружинами от одного к другому: это разреженная система, поскольку соединены только соседние шарики. Напротив, если бы одна и та же линия шариков имела пружины, соединяющие каждый шарик со всеми остальными шариками, система соответствовала бы плотной матрице. Концепция разреженности полезна в комбинаторике и прикладных областях, таких как теория сетей и численный анализ, которые обычно имеют низкую плотность значимых данных или соединений. Большие разреженные матрицы часто появляются в научных или инженерных приложениях при решении уравнений в частных производных. Разреженные матрицы встречаются при решении многих важных практических задач: структурного анализа, в теории графов, теории электрических сетей и энергосистем распределения энергии[2], при численном решении дифференциальных уравнений, математической физики, строительной механики, механики конструкций летательных и иных аппаратов; при прогнозировании метеорологических и гидрогеологических процессов[3]; при обеспечении работы графических процессоров[4], а также при изучении статического равновесия физических, технических, биологических, производственно-экономических и других типов систем.[5]
При хранении разреженных матриц и манипулировании ими на компьютере полезно и часто необходимо использовать специализированные алгоритмы и структуры данных, которые используют преимущества разреженной структуры матрицы. Для разреженных матриц были созданы специализированные компьютеры[6], поскольку они широко распространены в области машинного обучения.[7] Операции, использующие стандартные структуры и алгоритмы с плотной матрицей, являются медленными и неэффективными при применении к большим разреженным матрицам, поскольку обработка и память тратятся впустую на нули. Разреженные данные по своей природе легче сжимаются и, следовательно, требуют значительно меньшего объема памяти. Некоторыми очень большими разреженными матрицами невозможно манипулировать с помощью стандартных алгоритмов с плотной матрицей.
Содержание
1 Свойства и структура алгоритмов
Пусть дана разреженная матрица [math]A[/math] = [math]\begin{pmatrix} 0 & 6 & 0 & 0 \\ 4 & 0 & 0 & 0 \\ 0 & 0 & 2 & 0 \\ 0 & 7 & 0 & 1 \\ \end{pmatrix}[/math]
Существует несколько типов хранения разреженных матриц, которые позволяют оптимально использовать память и ускорить выполнение операций. Некоторые из наиболее популярных методов хранения разреженных матриц включают:
1. Список списков (List of Lists, LIL): В этом представлении разреженной матрицы каждая строка матрицы хранится в виде списка, содержащего пары (индекс столбца, значение). Этот формат удобен для построения и модификации разреженных матриц, но может быть неэффективным для матричных операций.
LIL (List of Lists) представление будет выглядеть следующим образом:
LIL(A) = [
[(1, 6)], # ненулевой элемент в 1-й строке - 6 во 2-м столбце
[(0, 4)], # ненулевой элемент в 2-й строке - 4 в 1-м столбце
[(2, 2)], # ненулевой элемент в 3-й строке - 2 в 3-м столбце
[(1, 7), (3, 1)] # ненулевые элементы в 4-й строке - 7 во 2-м столбце, 1 в 4-м столбце
]
2. Сжатое представление по строкам (Compressed Sparse Row, CSR) / Сжатое представление по столбцам (Compressed Sparse Column, CSC): В CSR и CSC форматах разреженная матрица представляется с помощью трех одномерных массивов: значения (non-zero values), индексы столбцов (column indices) и указатели на начало каждой строки (row pointers) для CSR или указатели на начало каждого столбца (column pointers) для CSC. Эти форматы являются наиболее распространенными и эффективными для матричных операций, таких как сложение, умножение и транспонирование.
CSR (Compressed Sparse Row) представление будет выглядеть следующим образом:
values = [6, 4, 2, 7, 1]
column_indices = [1, 0, 2, 1, 3]
row_pointers = [0, 1, 2, 3, 5]
CSC (Compressed Sparse Column) представление для этой же матрицы будет таким:
values = [4, 6, 7, 2, 1]
row_indices = [1, 0, 3, 2, 3]
column_pointers = [0, 1, 3, 4, 5]
3. Координатный формат (COO, Coordinate List): В координатном формате каждый ненулевой элемент матрицы представляется с помощью трех значений: индекс строки, индекс столбца и значение элемента. Этот формат удобен для добавления и изучения элементов, но менее эффективен для выполнения матричных операций по сравнению с CSR и CSC.
COO (Coordinate List) представление:
row_indices = [0, 1, 2, 3, 3]
column_indices = [1, 0, 2, 1, 3]
values = [6, 4, 2, 7, 1]
4. Диагональное представление (DIA, Diagonal Storage): В этом формате хранятся только диагонали матрицы, содержащие хотя бы одно ненулевое значение. Это достигается путем хранения значений диагоналей в двумерном массиве и массива смещений для каждой диагонали. DIA подходит для матриц с преимущественно диагональными элементами, например, для тридиагональных матриц, встречающихся при решении уравнений методом прогонки.
DIA (Diagonal Storage) представление: Поскольку матрица A содержит 4 диагонали с ненулевыми элементами, DIA представление будет включать только их: Диагональ с индексом 1 (диагональ выше главной): [6, 0, 0]; Диагональ с индексом 0 (главная диагональ): [0, 0, 2, 1]; Диагональ с индексом -1 (диагональ ниже главной): [4, 0, 0]; Диагональ с индексом -2 (диагональ ниже главной): [0, 7]
[math]diagonals[/math] = [math]\begin{pmatrix} * & * & 0 & * \\ * & 4 & 0 & 6 \\ 0 & 0 & 2 & 0 \\ 7 & 0 & 1 & 0 \\ \end{pmatrix}[/math]
[math]offsets[/math] = [-2 -1 0 1]
Здесь [math]diagonals[/math] - двумерный массив значений диагоналей матрицы [math] A[/math] . Порядок следования диагоналей в массиве выбирается произвольно. [math]offsets[/math] - одномерный массив, который указывает смещение каждой диагонали относительно главной диагонали. Положительные значения указывают на диагонали, расположенные выше главной, отрицательные значения - ниже главной.
5. ELLPACK / ITPACK представление (ELLPACK / ITPACK, ELL): В ELLPACK / ITPACK формате каждая строка матрицы представлена вектором фиксированной длины, содержащим значения и индексы столбцов L наиболее длинных строк, остальные элементы дополняются нулями. Это делает этот формат легко параллелизуемым на графических процессорах, но он может быть неэффективным, если разница в количестве ненулевых элементов между самой длинной и самой короткой строками слишком велика.
ELLPACK / ITPACK (ELL) представление определяется с использованием фиксированной длины массивов для строк матрицы. В данной матрице максимальное количество ненулевых элементов в строках равно 2 (для строки 4). Будем использовать массивы длины 2.
[math]indices[/math] = [math]\begin{pmatrix} 1 & -1 \\ 0 & -1 \\ 2 & -1 \\ 1 & 3 \\ \end{pmatrix}[/math]
[math]values[/math] = [math]\begin{pmatrix} 6 & 0 \\ 4 & 0 \\ 2 & 0 \\ 7 & 1 \\ \end{pmatrix}[/math]
Здесь [math]indices[/math] - двумерный массив, в котором каждая строка содержит индексы столбцов ненулевых элементов соответствующей строки матрицы [math]A[/math]. Если количество ненулевых элементов в строке меньше, чем максимальное количество для других строк, то оставшиеся значения дополняются специальным индексом(обычно -1). [math]values[/math] - двумерный массив такой же структуры, как и массив [math]indices[/math], но он содержит сами ненулевые значения элементов матрицы [math]A[/math]. Если строка содержит менее максимального количества ненулевых элементов, то оставшиеся значения в строке дополняются нулями.
Выбор подходящего формата хранения разреженной матрицы зависит от решаемой задачи, преимущественно используемых операций и требований к производительности.
1.1 Общее описание алгоритма
Перемножение разреженных матриц - одна из задач в алгоритмах линейной алгебры, широко применяющаяся в различных методах. Здесь мы рассмотрим умножение [math]C = AB[/math] разреженных матриц (последовательный вещественный вариант), в реализации алгоритма перемножения существенно будет использовано представление матрицы.
1.2 Математическое описание алгоритма
Исходные данные: разреженная матрица [math]A[/math] (элементы [math]a_{ij}[/math]), разреженная матрица [math]B[/math] (элементы [math]b_{ij}[/math]).
Вычисляемые данные: плотная матрица [math]C[/math] (элементы [math]c_{ij}[/math]).
Формулы метода:
- [math] \begin{align} c_{ij} = \sum_{k = 1}^{n} a_{ik} b_{kj}, \quad i \in [1, m], \quad j \in [1, l]. \end{align} [/math]
Существует также блочная версия метода, однако в данном описании разобран только точечный метод.
2 Литература
- ↑ 1,0 1,1 Yan, Di; Wu, Tao; Liu, Ying; Gao, Yang (2017). "An efficient sparse-dense matrix multiplication on a multicore system". 2017 IEEE 17th International Conference on Communication Technology (ICCT). IEEE. pp. 1880–1883. doi:10.1109/icct.2017.8359956. ISBN 978-1-5090-3944-9.
- ↑ Тьюарсон Р. Разреженные матрицы. — М.: Мир, 1977.
- ↑ Брумштейн Ю. М, Использование псеводогидродинамической постановки в задачах фильтрации со свободной поверхностью // Естественные науки. Астрахань: Издательский дом «Астраханский университет». — 2004. — № 8. — С. 125–128.
- ↑ Dehnavi M. M., Fernández D. M., Giannacopoulos D. Finite-element sparse matrix vector multiplication on graphic processing units // IEEE Transactions on Magnetics. — 2010. — Vol. 46, № 8. — P. 2982–2985.
- ↑ Солнцева М. О., Кухаренко Б. Г. Применение методов кластеризации узлов на графах с разреженными матрицами смежности в задачах логистики // Труды МФТИ. — 2013. — Т. 5, № 3 (19). — С. 75–83.
- ↑ Cerebras Systems Unveils the Industry's First Trillion Transistor Chip
- ↑ Argonne national laboratory deploys cerebras cs1 the worlds fastest artificial intelligence computer