2

私はGNUScientificLibrary(GSL)行列演算に深く埋め込まれたコードを持っています。このコードの主な計算は、シリアルで非常に長い時間がかかる線形方程式の大規模なシステムを解くことであり、GSLおよびBLAS関数を使用する方法があります。この計算を並列化するか、ScaLAPACKのようなすでに並列化されたライブラリで使用するために変換しますか?

4

2 に答える 2

2

行列がスパースである場合、つまりゼロエントリが多数含まれている場合は、多くのスパース行列代数パッケージをそれほど問題なく簡単に実装できます。残念ながら、これには行列をスパース形式で格納する必要がありますが、私の知る限りではそうでgslはありません。行列をスパース形式で保存すると、シリアルアプリケーションであっても、大規模なシステムをそれほど問題なく処理できるようになります。

UMFPACKを使用することをお勧めします。これは、データを構造に配置する必要がないため、実装に必要な作業が最小限であるためです。

並列処理に関する注意: コードが現在シリアルである場合、並列ソルバーに移動するのは簡単ではありません。マルチスレッドパッケージを実装するのは簡単かもしれませんが、私はスレッドプログラムの経験があまりありません。さらに、各プロセッサには完全な行列の独自のコピーが必要であり、反復法を使用する方がよいため、真の並列(分散メモリ)直接ソルバーはそれほど効率的ではありません。

もう少し詳細が役立つでしょう:長い時間はどれくらいですか?何らかの理由で逆関数が必要ですか、それとも連立方程式を解くだけですか?

于 2012-03-16T19:09:23.460 に答える
1

Intel MKLを試しましたか?これには、独自の並列バージョンのblas関数が含まれています。前回試したときは、かなり速いです。ただし、マトリックスのサイズに関する情報を提供すると答えるのも簡単ですが、x64、多くのCPU /コア、および多くのRAMを実行している限り、それは実際には問題ではありません。

もう1つのオプションはnVidiaCUDAです。それらのインターフェースはblasに似ていますが、実際にはMKLよりも低速であり、シリアルよりも高速です。古いカードで試したのかもしれませんが、それを便利にするには、少なくとも200GPUストリームユニットが必要です。

編集:これらのサイズの行列は私の経験を超えています。

于 2012-03-15T16:04:24.243 に答える