Каковы издержки при умножении разреженных матриц


10

Умножается ли матричное умножение (как Mat * Mat, так и Mat * Vec) на количество ненулевых элементов или на размер матрицы? Или какая-то комбинация двух.

Как насчет формы.

Например, у меня есть матрица 100 x 100 с 100 значениями в ней или матрица 1000 x 1000 с 100 значениями в ней.

При возведении в квадрат этих матриц (или умножении их на аналогичные матрицы с одинаковой разреженностью) будет ли первая (100x100) быстрее второй (1000x1000)? Зависит ли это от того, где находятся значения?

Если это зависит от реализации, меня интересует ответ для PETSc.

Ответы:


11

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

Стоимость редкого умножения матрицы на матрицу сильно зависит от структуры ненулевых элементов. Например, рассмотрим возведение в квадрат разреженной матрицы имеющей структуру стрелки :A

A=(δ1β1δ2β2δn1βn1γ1γ2γn1δn),

тогда имеет ненулевых, но плотно. Существует известная интерпретация графа этого явления: каждый путь длины 1 или 2 в графе становится ребром в графе (т. Е. Ненулевая запись в ).O ( n ) A 2 A A 2 A 2AO(n)A2AA2A2


4

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

В документации PETSc поясняется, что хранилищем по умолчанию для разреженных матриц является хранилище сжатых строк, которое масштабируется с количеством строк и числом ненулевых значений в строке. Так что я ожидаю, что MatMat будет широко масштабироваться с квадратом этой меры; то есть .O(r2n2)

Однако следует отметить, что нет смысла хранить то, чего там нет; если вы заботитесь об этой производительности, почему вы храните 100 значений для матрицы 1000x1000? Это означает, что по крайней мере 90% строк / столбцов вообще не имеют ненулевых значений и могут быть полностью удалены из матрицы. Если шаблон ненулевых значений не изменяется, рассмотрите возможность удаления строк всегда с нулем как из этой, так и из целевой матрицы; это устранит около 90% усилий, оставив производительность двух матриц (100 2 , 1000 2 ) в целом эквивалентной.


Пустые строки и столбцы часто имеют функцию в отношении проблемы (например, поддержание равномерного отображения между номером строки и местоположением на изображении). Однако будет компромисс, не избавившись от них.
Meawoppl

Точно; ухудшение производительности во время выполнения примерно в 10 раз, просто для того, чтобы поддерживать отображение, которое вы могли бы хранить в одном массиве по 100 дюймов, это не нормальный компромисс. Поскольку вопрос касался производительности как размера матрицы, то это очень важный момент, особенно для PETSc, как он и спросил.
Фил Х

3

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.