スパース行列乗算のオーバーヘッドは何ですか


10

行列の乗算(Mat * MatとMat * Vecの両方)は、0以外の数、または行列のサイズでスケーリングされますか?または、2つの組み合わせ。

形状についてはどうでしょう。

たとえば、100個の値を含む100 x 100のマトリックス、または100個の値を含む1000 x 1000のマトリックスがあります。

これらの行列を2乗する(または、同様のスパース性を持つ同様の行列を掛ける)と、最初の(100x100)は2番目の(1000x1000)よりも速くなりますか?値がどこにあるかに依存しますか?

実装に依存している場合は、PETScの回答に興味があります。

回答:


11

スパース行列とベクトルの乗算のコストは、各エントリがベクトル内のいくつかのエントリで1回乗算されるため、ゼロ以外のエントリの数に比例します。

A

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

AO(n)A2AA2A2


4

まず、実装に依存します。疎行列を密行列として実装し、ゼロ以外の値を入力すると、行列全体のサイズに合わせてスケーリングされます。非ゼロとして格納されている場合は、アクセス時間がマトリックスサイズに比例してスケーリングされます。

O(r2n2)

ただし、注意すべき点の1つは、存在しないものを保存しても意味がないことです。このパフォーマンスに関心がある場合、なぜ1000x1000マトリックスに100の値を格納するのですか?これは、行/列の少なくとも90%にゼロ以外の値がまったくなく、行列から完全に削除できることを意味します。ゼロ以外の値のパターンが変わらない場合は、これとターゲット行列の両方から常にすべてゼロの行を削除することを検討してください。これは、2つの行列の性能(100残して、努力のいくつかの90%を除去する2 1000 2を広く相当)。


空の行と列は、問題に関して機能することがよくあります(たとえば、行番号と画像内の場所との間の均一なマッピングを維持します)ただし、これらを取り除かないトレードオフがあります。
meawoppl

丁度; 100整数の単一配列に格納できるマッピングを維持するためだけにランタイムパフォーマンスを約10倍悪化させることは、通常のトレードオフではありません。質問は、マトリックススケールのブランクサイズとしてのパフォーマンスに関するものだったので、彼が尋ねたように、これは特にPETScにとってかなり重要なポイントです。
Phil H

3

SpMV性能の完全なモデルがで与えられている。この論文。複数のベクトルを使用すると負荷を軽減できますが、主な制限は帯域幅であることを明確に示しています。その後、命令発行の制限と、未解決の書き込み命令の制限に遭遇すると思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.