問題タブ [scalapack]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
matrix - ブロックおよびブロック巡回行列分布について
行列の並列分解を扱う際に、ブロック分布に精通しています。ここでは、(たとえば) 4 つのプロセスがあり、それぞれに行列のサブ領域があります。
たとえば、ここでは、行 ( procrows
) のプロセス数が 2 に等しく、列 ( ) のプロセス数も 2 に等しく、元のマトリックス サイズが の場合、proccols
サブマトリックスのサイズは になります。A_local
N/2 x M/2
N x M
「ブロック循環」分布を使用するこの例を読んでいます。この部分では:
それらはハードコーディングされていますが、問題ありませんが、読み込まれたマトリックスの場合、ヘッダーがありますprocrows
。proccols
Nb と Mb は [行列の] ブロックの行と列の数になります。
これはわかりません。N、M、procrows、proccols によって完全に決定されるのではNb
ありませんか?Mb
編集
例を実行すると、プロセス 0 のサブマトリックスには、上の図のように、マトリックスの左上隅のすべての要素が含まれていることがわかります。これは、ジョナサンの答えと矛盾しています。ただし、ScaLAPACK の Cholesky では問題なく動作します。
c++ - pdpotri() を呼び出す前にバリアを配置する必要がありますか?
コレスキー分解を実行するためにpdpotrf()を使用しています。次に、行列を反転するためにpdpotri()を呼び出したいと思います。この関数は、 の直後に、すべてのプロセスから呼び出されますpdpotrf()
。そこに障壁を置いて、すべてのプロセスがコレスキー分解で完了したことを確認してから、反転部分に進むべきですか、それとも必要ありませんか?
小さな入力でいくつかの例を書きましたが、それは必要ないことを示していますが、私は単に (不) 運が悪く、大きな入力で問題に直面しているのではないことを確認したいと思います。
バリアとは、次のことを意味することに注意してください。MPI_Barrier(MPI_COMM_WORLD);
編集
他のプロセスがコレスキー分解を終了する前に、反転が開始されるのではないかと心配しています。pdpotri()
これは気をつけますか?つまり、必要に応じてチェックして待機します。それともpdpotri()
、呼び出しプロセスのサブマトリックスでのみ機能しますか? もしそうなら、障壁は必要ありません。
c++ - 配布版の算術エラーを修正
ここで説明したように、分散環境でコレスキー分解を介して行列を反転しています。私のコードは正常に動作しますが、分散プロジェクトが正しい結果を生成することをテストするために、シリアル バージョンと比較する必要がありました。結果はまったく同じではありません!
たとえば、結果マトリックスの最後の 5 つのセルは次のようになります。
それについてIntel フォーラムに投稿しましたが、私が得た答えは、分散バージョンで行うすべての実行で同じ結果が得られるというものでした。彼らは(別のスレッドで)これに応答できないようです:
シリアル実行と分散実行の間で同じ結果を得る方法は? これは可能ですか?これにより、算術エラーが修正されます。
this:mkl_cbwr_set(MKL_CBWR_AVX);
を設定して、メモリを整列させるために , を使用しようとしmkl_malloc()
ましたが、何も変わりませんでした。同じ結果が得られますが、分散バージョンのプロセスを 1 つ生成した場合のみです (これにより、ほぼシリアルになります)。
fortran - FortranでSCALAPACKを使用するとセグメンテーション違反? バックトレースなし?
Fortran で SCALAPACK と MPI を使用して、エルミート行列の固有値と固有ベクトルを見つけようとしています。バグをつぶすために、このプログラムをできるだけ単純にしましたが、それでもセグメンテーション違反が発生します。同様の質問を持つ人々への回答によると、すべての整数を整数 * 8 に変更し、すべての実数を実数 * 8 または実数 * 16 に変更しようとしましたが、それでもこの問題が発生します。最も興味深いのは、セグメンテーション違反のバックトレースすら得られないことです。プログラムはバックトレースを提供しようとするとハングアップし、手動で中止する必要があります。
また、私の知識不足をお許しください。私はほとんどのプログラム関連のことには慣れていませんが、最善を尽くしました。これが私のコードです:
問題は、2 番目の PZHEEVX 関数にあります。このコードは、正常に動作する別のより複雑なコードの単純なバージョンであるため、正しく使用していると確信しています。この目的のために、私は 1 つのプロセッサのみを使用しています。
ヘルプ!