희소 행렬 곱셈의 오버 헤드는 무엇입니까


10

행렬 곱하기 (Mat * Mat 및 Mat * Vec 모두)는 0이 아닌 수 또는 행렬의 크기로 확장됩니까? 또는이 둘의 조합.

모양은 어떻습니까?

예를 들어 100 값을 가진 100 x 100 행렬 또는 100 값을 가진 1000 x 1000 행렬이 있습니다.

이 행렬을 제곱하거나 비슷한 희소성을 가진 유사한 행렬로 곱하면 첫 번째 (100x100)가 두 번째 (1000x1000)보다 빠릅니까? 값이 어디에 있는지에 따라 달라 집니까?

구현에 따라 다르면 PETSc에 대한 답변에 관심이 있습니다.

답변:


11

희소 행렬-벡터 곱셈의 비용은 각 항목에 벡터의 일부 항목이 한 번 곱하기 때문에 0이 아닌 항목의 수와 선형으로 확장됩니다.

희소 행렬-행렬 곱셈의 비용은 0이 아닌 구조에 크게 의존합니다. 예를 들어, 화살촉 구조 의 희소 행렬 를 제곱하는 것을 고려하십시오 .

=(δ1β1δ2β2δ1β1γ1γ2γ1δ),

다음 갖는 O ( N ) nonzeros, 그러나 2 조밀하다. 이 현상에 대한 잘 알려진 그래프 해석이있다 : A 의 그래프에서 길이 1 또는 2의 모든 경로 는 A 2 의 그래프에서 에지가된다 (즉, A 2 에서 0이 아닌 엔트리 ).영형()222


4

첫째, 구현에 따라 다릅니다. 희소 행렬을 밀도가 높은 행렬로 구현하고 0이 아닌 값을 채우면 행렬의 전체 크기에 따라 크기가 조정됩니다. 0이 아닌 값으로 저장되면 액세스 시간이 매트릭스 크기에 따라 크기가 조정되므로 크기가 조정됩니다.

PETSc 문서 에서 스파 스 행렬의 기본 저장소는 압축 된 행 저장소이며 행 수 및 행당 0이 아닌 값의 수로 확장됩니다. 따라서 MatMat이이 측정 값의 제곱으로 확장 될 것으로 기대합니다. 즉 .영형(아르 자형22)

그러나 주목해야 할 것은 존재하지 않는 것을 저장하는 포인트가 없다는 것입니다. 이 성능에 관심이 있다면 왜 1000x1000 매트릭스에 100 개의 값을 저장합니까? 이는 행 / 열의 90 % 이상이 전혀 0이 아닌 값을 가지지 않으며 행렬에서 완전히 제거 될 수 있음을 의미합니다. 0이 아닌 값의 패턴이 변경되지 않으면이 행렬과 대상 행렬 모두에서 항상 0으로 된 행을 제거하는 것이 좋습니다. 그것은 노력의 약 90 %를 제거하여 두 행렬 (100 2 , 1000 2 ) 의 성능을 대체로 동일하게 유지합니다.


빈 행과 열은 종종 문제와 관련하여 기능을합니다 (예를 들어 이미지에서 행 번호 사이의 위치에 균일 한 매핑을 유지).
meawoppl

바로 그거죠; 100 int의 단일 배열에 저장할 수있는 매핑을 유지하는 것만으로 런타임 성능을 약 10 배 악화시키는 것은 일반적인 트레이드 오프가 아닙니다. 문제는 매트릭스의 블랭크 크기에 따른 성능에 관한 것이 었으므로 PETSc에게 특히 중요한 점입니다.
Phil H

3

이 백서 에는 SpMV 성능의 전체 모델이 나와 있습니다. 여러 벡터를 사용하여 부담을 줄일 수 있지만 주 리미터가 대역폭임을 분명히 알 수 있습니다. 그 후 명령 문제 제한과 미해결 쓰기 명령에 대한 제한이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.