0

前文:

私は非常に大きな配列 (1 つの薄暗い) を持っており、進化方程式 (波のような方程式) を解く必要があります。この配列の各値で積分を計算し、積分の結果の配列を保存し、この配列に再び積分を適用する必要があります (簡単に言えば、値のグリッドに積分を適用し、この新しいグリッドを保存し、積分を適用します)再びなど)。

MPI-IO を使用してすべてのノードに分散しました。ディスクには共有 .dat ファイルがあり、各 MPI コピーはこのファイルを (統合のソースとして) 読み取り、統合を実行して、この共有ファイルに再度書き込みます。この手順が何度も繰り返されます。それは正常に動作します。最も時間のかかる部分は統合で、ファイルの読み書きはごくわずかでした。

現在の問題:

今、私は1024 (16x64 CPU) HPC クラスターに移行しましたが、逆の問題に直面しています: 読み取り/書き込みプロセスの計算時間はごくわずかです!!!

MPI プロセスの数を削減しようとしました。各ノード内で計算を並列化するために、OpenMP で 16 MPI プロセス (ノードに分散するため) + 64 スレッドのみを使用します。

繰り返しますが、読み取りと書き込みのプロセスは、現在最も時間がかかる部分です。

質問

最小限の損失で 1024 個の CPU の能力をフルに活用するには、プログラムをどのように変更すればよいですか?

重要な点は、1D 配列全体を完成させないと次のステップに進むことができないということです。

私の考え:

読み取りと書き込みの代わりに、rank=0 (マスター ランク) に、配列全体をすべてのノード (MPI_Bcast) に送受信するように依頼できます。そのため、各ノードが I/O する代わりに、1 つのノードだけが I/O を行います。

前もって感謝します!!!

4

1 に答える 1

2

私はここここを見ます。2 番目のサイトの FORTRAN コードはここにあり、C コードはここにあります。

アイデアは、配列全体を各プロセッサに渡さないということです。各プロセッサには、処理する部分のみを与え、プロセッサ間で重複する部分を設けて、相互の境界を処理できるようにします。

また、計算を時々ディスクに保存するのも正しいです。そして、そのためにMPI-IOが好きです。それが進むべき道だと思います。ただし、リンク内のコードを使用すると、毎回読まなくても実行できます。そして、私のお金では、毎回データを書き出すのはやり過ぎです。

于 2013-05-07T20:58:04.257 に答える