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

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 приведена в этой статье . Это ясно показывает, что основным ограничителем является пропускная способность, хотя вы можете уменьшить нагрузку, используя несколько векторов. После этого вы сталкиваетесь с ограничениями выдачи инструкций и лимитом невыполненных инструкций по написанию.

Мэтт Кнепли
источник