6

まばらなバンド行列 A があり、Ax=b を (直接) 解きたいと思います。私は約 500 個のベクトル b を持っているので、対応する 500 個の x を解きたいと思います。私はCUDAを初めて使用するので、利用可能なオプションについて少し混乱しています。

cuSOLVER には QR hereを使用したスパース A_i x_i = b_i のバッチ ダイレクト ソルバー cuSolverSP があります。(A は適切に条件付けられているので、LU でも問題ありません。) しかし、私が知る限り、すべての A_i が同じであるという事実を利用することはできません。

別のオプションは、最初に CPU または GPU でスパース LU (QR) 因数分解を決定し、次に GPU で逆代入 (それぞれ backsub と matrix mult) を並行して実行することでしょうか? cusolverSp < t >csrlsvlu()が 1 つの b_i に対するものである場合、複数の b_i に対してこの操作をバッチで実行する標準的な方法はありますか?

最後に、私はこれについて直感を持っていないので、必要なオーバーヘッドを考慮して、これらのオプションのいずれかで GPU の高速化を期待する必要がありますか? x の長さは ~10000-100000 です。ありがとう。

4

3 に答える 3

1

私は現在、自分自身に似たものに取り組んでいます。基本的に、CUDA SDK に付属する共役勾配ソルバーとレベル 0 不完全コレスキー前処理付き共役勾配ソルバー ユーティリティ サンプルを小さなクラスにラップすることにしました。

samples/7_CUDALibraries/conjugateGradientこれらは、次のパスの下の CUDA_HOME ディレクトリにあります。 /Developer/NVIDIA/CUDA-samples/7_CUDALibraries/conjugateGradientPrecond

基本的に、マトリックスをデバイス メモリに 1 回ロードし (そして、ICCG の場合は、対応するコンディショナー/マトリックス分析を計算し)、異なる b ベクトルを使用してソルブ カーネルを呼び出します。

マトリックスバンド構造がどのように見えると予想されるかはわかりませんが、それが対称であり、対角線が支配的である場合(各行と列に沿った対角線外のバンドは対角線の反対の符号であり、それらの合計は対角線のエントリよりも小さい)または正定値 (固有値が 0 の固有ベクトルがない) の場合、CG と ICCG が役立つはずです。別の方法として、さまざまなマルチグリッド アルゴリズムをコーディングする場合は、別のオプションとして使用できます。

行列が正の半正定値のみである場合 (たとえば、固有値がゼロの固有ベクトルが少なくとも 1 つある場合)、次のことを保証する限り、CG または ICCG を使用して問題を解決できることがよくあります。 1) 右辺 (b ベクトル)ヌル空間 (ゼロの固有値を持つ固有ベクトルを意味するヌル空間) に直交します。2) 得られる解は、ヌル空間に直交します。

自明でないヌル空間がある場合、異なる数値ソルバーが同じ正確なシステムに対して異なる答えを与える可能性があることに注意するのは興味深いことです。解決策は、null スペースの線形結合によって異なることになります...その問題は、最終的に理解する前に、多くの工数のデバッグとフラストレーションを引き起こしました。

最後に、マトリックスにサーキュラント バンド構造がある場合は、高速フーリエ変換 (FFT) ベースのソルバーの使用を検討できます。FFT ベースの数値ソルバーは、適用可能な場合に優れたパフォーマンスを発揮することがよくあります。

于 2015-06-22T20:12:20.983 に答える
1

複数のb_iに対してこの操作をバッチ実行する標準的な方法はありますか?

1 つのオプションは、CUDA の cuSOLVER でバッチ リファクタリング モジュールを使用することですが、それが標準かどうかはわかりません。

cuSOLVER のバッチ リファクタリング モジュールは、LU 分解に基づいて、左辺が固定されたスパース行列 (または、スパース パターンが固定されているが係数が変化する行列) および右辺が変化する線形システムのバッチを効率的に解く方法を提供します。それに関連する公式ドキュメント (CUDA 10.1 以降) には、部分的に完成したコード スニペットしかありません。完全な例はここにあります。

于 2020-06-18T10:00:48.617 に答える