LAPACKは3重対角システムをどのように解決しますか?その理由は?


9

私のプロジェクトでは、タイムステップごとに2つの3重対角行列を解く必要があるため、それらに対して優れたソルバーを使用することが重要です。私は独自の実装を行いましたが、ウィキペディアに記載されている古典的な方法で実装しました。その後、代わりにLapackを使用してみましたが、驚いたことに遅くなりました!

さて、Lapackの内部では、LU分解による解法を実行しているように見えますが、なぜそうなるよりも複雑ではないのでしょうか。

さらに、nr.comの「Numerical Recipes」の本で、システムを再帰的に小さな三重対角問題に分割するアルゴリズムを見つけました。それは有望に見えた。他にグッズはありますか?

更新:問題のサイズは約1000x1000です。私はGotoBLASを使用しましたが、Lapack 3.1.1ライブラリも提供します。問題は対称的ではありません。私は一般的な三重対角行列にLapackルーチンを使用しました。


2
このために使用したLAPACKルーチンを指定する必要があります。dgtsvは部分的なピボットを実行しますが、コードがこれを実行しない場合があることに注意してください。また、どのLAPACK実装でテストしたか、どの問題サイズでベンチマークしたかについてもお知らせください。また、問題は対称的な正定ですか?
Jed Brown

質問の定式化にいくつかの情報を追加しました。
tiam

あなたのアプリケーションは有限体積法と関係がありますか?
インクエスト

それは有限の違いですが、この見方では多かれ少なかれ同じだと思います。
tiam

回答:


6

部分的なピボットを行う参照実装を使用しています。三重対角ソルブは、ほとんど機能せず、BLASを呼び出しません。部分的なピボットを行うため、コードよりも遅くなる可能性があります。dgtsvソースコードは簡単です。

同じ行列で複数回解く場合は、dgttrfdgttrsを使用して因子を保存することができます。MKL、ACML、ESSLなどの最適化されたLAPACKでの実装のパフォーマンスが向上する可能性があります。


ちょっと気になります。PPを使用したGaussian Elimは、TriDiagonalを含むすべての行列で機能します。CFDでは、我々はと呼ばれるFVM 1Dの例のための特別な方法を使用しTDMA。彼が話し合っている場合、どちらが速いと思いますか?しかし、私は彼の行列が対角線上で支配的であるかどうか完全には確信していません。
質問

TDMAは、コードに実装したものです。問題は、なぜ超高速のLapackが、そのような特定の行列で部分ピボット手順を使用するのかということです。これは、TDMAのような簡単な方法ですばやく解決されます。
tiam

これはまったく同じアルゴリズム(三重対角行列に特化したガウスの消去法)ですが、実装は部分的なピボットを行わないため、数値的に不安定になる可能性があります。そのピボットは無料ではなく、リファレンス実装と比較しています。参照実装はパフォーマンスのために最適化されておらず、部分的なピボットは自由ではありません。
Jed Brown

私はあなたが何を意味するのかを理解し、私が解決しているシステムについての私の知識から利益を得ます。LAPACKの他の実装では、特定のアーキテクチャへの適応によりパフォーマンスが向上しますか、それともそれを超えますか?
tiam
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.