大規模なスパース対称(正定ではない)システムのソルバーの最良の選択


10

私は現在、いくつかの特定のアルゴリズムによって生成された非常に大規模な対称(ただし、正定値ではない)システムの解決に取り組んでいます。これらの行列には、並列解法に使用できる素晴らしいブロックスパース性があります。しかし、直接アプローチ(Multi-frontalなど)と反復アプローチ(前処理されたGMRESまたはMINRES)のどちらを使用するべきかを判断できません。私のすべての研究は、反復ソルバー(7つの内部反復のかなり高速な収束でさえ)が、MATLABの直接の '\'演算子に勝てないことを示しています。しかし、理論的には、直接法の方がコストがかかると考えられています。これはどうですか?そのような場合の最新の文書や紙はありますか?GMRESのような柔軟な反復ソルバーと同じくらい効率的な直接法を使用して、並列システムでブロックスパース性を使用できますか?


3
特定のマトリックスの詳細を知らなければ、これについて本当に効果的にコメントできる人はいないと思います。寸法は何ですか?スパースパターンはどのようなものですか?
コティス2013年

2
多くはあなたが大まかに何を意味するかに依存します。変数の数は数十万ですか?何百万?n
Brian Borchers 2013年

2
この質問はscicomp.stackexchange.com/q/81/276とかなり重複しています。そこで役立つ情報が見つかるかもしれません。また、その質問に基づいて、オペレーターのスペクトル(または事前に条件付けされたオペレーターのスペクトル)について話すことは有用かもしれません。
Geoff Oxberry 2013年

回答:


9

MUMPSスパースダイレクトソルバーは対称不定システムを処理でき、自由に利用できます(http://graal.ens-lyon.fr/MUMPS/)。Ian DuffはMUMPSとMA57の両方の作者の1人だったので、アルゴリズムには多くの類似点があります。

MUMPSは分散メモリ並列コンピューター用に設計されていますが、シングルプロセッサーマシンでもうまく機能します。これをマルチスレッドBLASライブラリとリンクすると、共有メモリのマルチコアプロセッサで妥当なスピードアップを実現できます。

「非常に大きい」の大きさは言わなかったが、MUMPSには、因数分解行列が使用可能なメモリに収まらない問題を処理するコア外機能もあります。


7

直接ソルバーが抱えている一般的な問題は、フィルイン現象です。これは、スパース行列の逆行列が密になる可能性があることを意味します。これは、マトリックスの構造が「適切」ではない場合、膨大なメモリ要件をもたらします。

これらの問題を回避する試みがあり、MATLABのデフォルトの- lu関数はそれらのいくつかを採用しています。順列、対角スケーリングなどの概要については、http://www.mathworks.de/de/help/matlab/ref/lu.htmlを参照してください。もちろん、MUMPS(http://graal.ens-lyon.fr/MUMPS/)のようなより高度なパッケージについても同じことが言えます。

ただし、一般に、問題が十分に大きい場合は、そのメモリ境界にぶつかるため、反復(クリロフ)メソッドを使用する必要があります。

問題が対称的で不明確な場合は、MINRESが当然の選択です。ただし、問題が対称であれば、GMRESとMINRESは正確な計算で同じことを行いますが、GMRESは直交性の損失の影響を受けにくい傾向があることに注意してください。したがって、GMRESを「MINRESの最良の実装」と見なす人もいます。

いずれにせよ、システムを事前調整することで利益が得られるでしょう。プレコンディショナーの調整に時間を費やしたくない場合は、不完全なLU分解プレコンディショナー(ILU)がすでにどこかに到達している可能性があります。


2

反復ソルバーは、問題が十分に大きい(大きい、必要なストレージ、実装の効率などのいくつかの要因に依存する)場合にのみ、直接法に勝ることができます。また、クリロフ法(GMRESなど)は、適切な事前調整を(実際に)使用する場合にのみ有効です。事前条件付けを使用していない場合、krylovメソッドは一般的に役に立ちません。私もブロックスパースマトリックス(これらはPDEアプリケーションからのもの)を操作し、粗いグリッド補正(またはマルチグリッド)と組み合わせて、ブロックの前処理済み(オーバーラップする添加物シュワルツ)クリロフソルバー(GMRESまたはBiCG-Stabのいずれか)がこれらに対してスケーラブルであることを確認しました行列のタイプ。


2

Matlab '\'演算子は、一流のプログラミングにより非常に効率的です。ティモシーデイビスの本で、アイデアの一部と、考えられるすべてのショートカットをどのように使用したかがわかるでしょう。

matlabでは、よく開発された安定したgmresを使用できます。おそらく理論的にはあなたの場合に理想的であるはずのminresは、それほど信頼できないかもしれません(少なくとも私の経験はそうです)。以下の場合は、MATLAB gmresから同等以上の効率が得られるはずです。

  1. システムは十分に大きい(少なくとも数千から数千)。
  2. 正しい種類のパラメーター(RESTART、MAXIT、X0)を使用している場合。これに関する明確なガイドラインはありません。あなたの経験を活用してください。
  3. 適切な前処理を使用してください。ILUを使用するか、さらに安価なブロックJacobiを使用できます。これはかなりの労力を削減します。
  4. 最も重要:マトリックスがスパースの場合は、MATLABスパースフォーマットを使用します。Matlab gmresはそのために理想的に構築されています。大幅なコスト削減になります。

さらに大きなシステムでは、PETScなどのツールを使用します。


1

マトリックスの次元が数万の中程度以下の場合は、直接法を使用しますが、不明確な対称システム用の自由に利用できる直接法は多くありません(実際、私が知っているオープンソースはありません)。HSL のMA57がありますが、それは学術目的でのみ無料です。対称性を無視してUMFPACKを使用できます

次元数が数千に達すると、ダイレクトメソッドのメモリ使用量は、通常のデスクトップコンピュータが合理的に処理できる量を超え始めます。そのため、強力な共有メモリマシンがない限り、反復法に移行する必要があります。不確定な問題の場合、ブレークダウンは可能ですが、対称システム用のBiCG(バイコンジュゲート勾配)を特化できます。より数値的な安定性を提供する対称システム用に最近リリースされたMINRES-QLPがあります。

直接的な方法では実際に行列を形成する必要があるため、2つの方法にはかなり異なる実装が必要ですが、反復アプローチでは通常、明示的に行列を形成しません。

特に行列の次元の関数として、1つのアプローチが他のアプローチよりも高速になる理由はいくつかあります。非常に悪条件のシステムの場合、反復法はかなりひどく停滞する可能性があります。それほどスパースでない行列の場合、直接的な方法では、大量の塗りつぶしが作成され、処理速度が大幅に低下します。また、Matlabの直接法は高度に最適化されていますが(UMFPACKまたはMA57を内部で使用します)、反復法は通常Matlabで直接コーディングされます。ボトルネックはmatvecsとドット積のアプリケーションであるため、レベル3のBLASを利用する機会は少なくなります。

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