スパースマトリックスストレージとデンスマトリックスストレージの経験則


9

マトリックスの予想されるスパース性(つまり、非ゼロの数/非ゼロの可能な合計数)がわかっているとします。スパースマトリックスストレージ(具体的には、圧縮された行ストレージ)を使用するか、高密度マトリックスとして保存するかを決定するための経験則(おそらくおおよそ)はありますか?

  1. 私のアプリケーションでは、メモリよりも速度が重要です。しかし、一般的な好奇心から、スピードとメモリの両方の観点からの回答に興味があります。
  2. 行列を生成した後は、加算と乗算の演算のみを適用します。
  3. 私は定性的な答えしか見つけることができませんでした。たとえば、この質問この質問ですが、次のようなものを探しています

...スパース性が約超える場合は、高密度ストレージを使用します。x%

回答:


8

すべての行列演算は、今日のプロセッサではメモリバウンドです(コンピューティングバウンドではありません)。したがって、基本的には、格納するバイト数が少ない形式を確認する必要があります。これは簡単に計算できます:

  • 完全な行列の場合、エントリごとに8バイト(1つのダブル)を格納します
  • スパースマトリックスの場合、エントリごとに12バイトを格納します(値に1つのdouble、エントリの列インデックスに1つの整数)。

言い換えると、スパース性が67%未満の場合、つまり、ほぼすべてのマトリックスで、妥当な人がスパースを呼び出す場合、スパースマトリックス形式は、メモリ使用量が増えるだけでなく、計算時間も短縮されます。


誰かがこの回答に反対票を投じた理由を知りたいのですが。これは定性的、定量的であり、大まかな目安になります。もし私がそれを2回賛成できれば、そうします。
チャールズ

3
それよりもわずかに多くのストレージが必要になります。行も追跡する必要があります。行あたり1ビットで十分です。
ブライアンボーチャーズ2018

3
密行列の行列行列乗算は、ピークFLOPSに非常に近づくことができる十分なキャッシュ再利用を得る1つの場所です。行列ベクトルの乗算はメモリ帯域幅が制限されることに同意します。
ブライアンボーチャーズ2018

1
67%は、計算がスパース性から利益を得るポイントから実際には非常に離れています。密な行列とベクトルの乗算は、キャッシングから非常に大きな利益を得ることができます。(スパース行列とベクトルの乗算には非常に不規則なメモリアクセスが必要です。)直接ソルバーで線形システムを解くことについてである場合、非ゼロ値が0.1%未満の場合、行列はスパースであると言われることがあります。しかし実際には、行列のエントリの実際の接続性は、非ゼロの数よりもはるかに重要です。
Henrik Schumacher

1
@WolfgangBangerth:スパースの定義(「スパース」とは、行ごとの非ゼロエントリの数が、ますます大きくなる一連の行列のサイズに依存しないことを意味します。)は、JHウィルキンソンの(非公式な作業)定義とはかなり異なります。 :「文献でよく引用されている、ゼロを利用するのに十分なゼロがある行列」。私はウィルキンソンの定義を好みます。
2018

11

価値があるのは、MATLABとIntel MKLをBLASとして使用しているXeonワークステーションで、サイズが10,000 x 10,000のランダム疎行列と同じサイズの密行列の場合、密度が15%の場合、疎行列とベクトルの乗算が高速であった以下。67%(別の回答で提案されているように)では、密な行列とベクトルの乗算は約3倍高速でした。


興味深い、ありがとう。私のマトリックスの一部は最大30-40%のスパース(15%と67%の見積もりの​​間に不便なほど正確)であるため、メモリ(利点は減速する価値があります。
EM_IE 2018

3
多くは、使用しているハードウェアとソフトウェアに依存します。私のマシンにはクアッドチャネルメモリが搭載されているため、通常のデュアルチャネルシステムよりもメモリ帯域幅が多くなります。MKLは非常に優れたBLASであり、MATLABのスパースマトリックスデータ構造は、このために完全に最適化されていない場合があります。
ブライアンボーチャーズ2018

1
圧縮された行ストレージ(または圧縮された列ストレージ)の問題の1つは、通常、エントリがメモリ内のインデックス情報とは異なる領域に格納されることです。この局所性の欠如は、パフォーマンスを低下させる可能性があります。これに対して、従来の密行列ストレージ(行(C)または列(Fortran)による)では、より効率的な方法でメモリから連続して行列のエントリを読み込むことができます。
ブライアンボーチャーズ2018

1
近年、mutlcoreプロセッサ、SIMD命令を備えたマシン、およびGPUでスパースマトリックス-ベクトル乗算のパフォーマンスを向上させるスパースマトリックスの新しいストレージフォーマットに関する研究が行われています。例を参照してください:pdfs.semanticscholar.org/041b/…–
ブライアン

5

行列が非常に疎である場合でも、それ自体との行列積は密になる可能性があります。たとえば、対角行列を取り上げ、その最初の行と列をゼロ以外のエントリで埋めます。その製品自体は完全に高密度になります。そのような行列は、たとえば、他のすべての頂点に接続されている頂点があるグラフのグラフラプラシアンとして発生する可能性があります。実際には、ネットワークの他の部分への接続性が非常に高い頂点がいくつかあれば十分です。行列とベクトルの乗算の場合、この現象はあまり重要ではありませんが、行列とベクトルの乗算を並列化しようとすると不均衡が生じる可能性があります。

ここで強調したいことは、スパースパターンと、マトリックスをどのように処理するかによって異なります。したがって、私が思いつくことができる疎行列の最良の定義(同時にかなり役に立たない)は次のとおりです。

ゼロ以外の値とその位置のみを格納し、発生するデータ構造の管理から生じる追加のオーバーヘッドを投資することが有利である場合、マトリックスはスパースです。

学ぶべき教訓:それは、実際に何をしたいかどのアルゴリズムを使用するか、(他の人がすでに指摘しているように)特定の行列がスパースであるかどうかに関係なく、どのハードおよびソフトウェアを使用するかに依存します(次のように読みます:疎または密行列データ構造を使用する必要があるかどうか)。データの格納や行列とベクトルの乗算だけではない場合は、純粋にパーセンテージベースのルールはありません。行列がスパースであるかどうかを確認する最良の方法は、それを試して密行列法と比較することです。


1
有名なJHウィルキンソンは、スパース行列を次のように定義しました。まさにこの定義は他の人たちによって頻繁に引用されてきました。それにもかかわらず、あなたの定義も非常に適しています。
2018

1
いいね。それはまさに私が模倣しようとした定義ですが、ソースを思い出すことができませんでした。
ヘンリックシューマッハ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.