パフォーマンスとスケーラビリティの問題のために、既存の 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 を使用し、バリアを使用して残りのスレッドをアイドル状態に保ちます。
 - 他に可能な方法はありますか?
 
コードのパフォーマンスとスケーラビリティは私にとって非常に重要であり、皆さんからの助けが必要です!
ありがとう