パフォーマンスとスケーラビリティの問題のために、既存の MPI コードをハイブリッド MPI/OpenMP に変換しています。元の MPI コードでは、集合 MPI I/O (具体的には MPI_File_write/read_at_all) を使用していましたが、ハイブリッド モードに変換しているため、パフォーマンスを落とさずに I/O を操作する方法がわかりません。私が現在使用しているシステムには 32 コアの複数のノードがあり、私の計画では、各ノードごとに 1 つの MPI プロセスを実行し、各ノード内で 32 のスレッドを実行することです。システムとコンパイラ (PGI) は MPI_THREAD_MULTIPLE をサポートし、Lustre ベースの並列ファイル システムを備えています。私のコードは次のようなものです:
#include "mpi.h"
#include "omp.h"
#define NTHREADS 32
int main()
{
int provided;
int myrank,numproc,tid;
double b[BIGSIZE]={0.};
int iter,i;
MPI_Init_thread( 0, 0, MPI_THREAD_MULTIPLE, &provided );
omp_set_num_threads(NTHREADS);
/* Initialize b */
#pragma omp parallel private(i,some variables)\
shared(b and some other stuffs)\
default(none)
{
/* Inside each thread: */
for (i=0;i<iter;i++)
{
/* each thread of each process do work on few elements of variable b */
/* 2 threads do less work and communicate with the other processes */
/* Write the variable b's of all MPI processes in one file */
/* b is actually divided between MPI processes and then is divided
between threads inside each process, so the work is distributed */
/* write operation MUST be complete before the next iteration starts */
}
}
MPI_Finalize();
return 0;
}
ここで私の質問は、最高のパフォーマンスを得るために書き込みセクションを処理する方法です。私は機械エンジニアなので、考えられる解決策に精通していません。これに取り組み始める前に、同様のケースの標準的な方法があるかどうかを確認したかったのですが、私の考えは次のとおりです。
- 各スレッド内で MPI_File_write_at を使用し、集合バージョンについては忘れてください (これが本当に正しいかどうかはわかりません。MPI_Barrier と omp_barrier を使用して完了を待つことはできますか?)、ファイル ポインターをどのように定義すればよいでしょうか? プライベートまたは共有?
- マスター ディレクティブのマスター スレッドで MPI_File_write_at_all を使用し、バリアを使用して残りのスレッドをアイドル状態に保ちます。
- 他に可能な方法はありますか?
コードのパフォーマンスとスケーラビリティは私にとって非常に重要であり、皆さんからの助けが必要です!
ありがとう