私は、このリンクに1つのようなマトリックスを有する:cuSolverSpルーチンのダイナミックレンジの大きい行列を扱う特別な方法はありますか?
https://www.dropbox.com/s/tte3rlfsrprgtt8/ExampleMatrix.txt?dl=0
この例では、要素の値が有意に大きさが異なる9x9の疎行列です。たとえば、最小要素の大きさは7.130249e-17で、最大値は1.944061e-07です。
この行列は、解く必要がある一次方程式Ax = bの集合のA行列です。私のアプリケーションでは、cuDoubleComplexタイプがAです。
現在、私はmagma_zgesv_batched(多くの(現在25個)を一度に計算し、AとBはそれぞれのバッチごとに異なる)を使用して、部分的なピボットと行インターチェンジによるLU分解を行います。これは動作し、私は加速しようとしている元のコードの出力と一致する正しい出力を提供します。私はこれがうまくいくと確信しています。
しかし、実際の生活では、私が解決する必要がある行列は〜2000 * 2000であり、magma_zgesv_batchedは小さな行列に使用するように設計されているので、この問題があります。非常に遅く、ネイティブバージョンを使用するよう警告します。 magma_zgesv_batchedで1024 * 1024までの行列サイズになっていますが、私はこれをまだテストしていません。
マトリックスAはスパースです(サイズが大きくなるにつれてより疎です)ので、私はcuSovlerSpルーチン、特にcusolverSpZcsrlsvluHost(部分的なピボットを伴う従来のLU)を使用しました。これはmagma_zgesv_batchedに最も似ています。
ただし、magma_zgesv_batchedとして正しい結果は得られません。しかし、やはり、私はcsr形式などで問題を正しくコーディングしていると確信しています。上記の9 * 9の行列と同じ位置に '通常の'(位数1)の数字を持つダミー行列をテストし、同等のMatlab A \ bと同じ(密な)ダミーAおよびbを使用すると、ダミーデータのcusolverSpZcsrlsvluHostと同じ出力が得られます。だから私はそれが大きなダイナミックレンジの私の問題で持っている特定のデータの問題であると確信しています。
だから私は大きなダイナミックレンジを持つマトリックス要素で他の誰かがこのような問題に遭遇したかどうか尋ねることができます。もしそうなら、どのように扱うことができますか?マトリックスに適用できるトリック/スケーリングはありますか?
magma_zgesv_batchedルーチンとcusolverSpルーチンの違いは何ですか?彼らは行列の逆転などを別にしますか?
私はこれが分かっているように、サイズの問題を軽減したmagma_zgesv_batchedを使用してください。
アドバイスをいただければ幸いです!
ありがとうございました