2

パフォーマンスとスケーラビリティの問題のために、既存の 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;
}

ここで私の質問は、最高のパフォーマンスを得るために書き込みセクションを処理する方法です。私は機械エンジニアなので、考えられる解決策に精通していません。これに取り組み始める前に、同様のケースの標準的な方法があるかどうかを確認したかったのですが、私の考えは次のとおりです。

  1. 各スレッド内で MPI_File_write_at を使用し、集合バージョンについては忘れてください (これが本当に正しいかどうかはわかりません。MPI_Barrier と omp_barrier を使用して完了を待つことはできますか?)、ファイル ポインターをどのように定義すればよいでしょうか? プライベートまたは共有?
  2. マスター ディレクティブのマスター スレッドで MPI_File_write_at_all を使用し、バリアを使用して残りのスレッドをアイドル状態に保ちます。
  3. 他に可能な方法はありますか?

コードのパフォーマンスとスケーラビリティは私にとって非常に重要であり、皆さんからの助けが必要です!

ありがとう

4

1 に答える 1

2

抱えていない問題に対して時期尚早に最適化していると思います。

計算を OpenMP と並列にすることから始め、いくつかの OpenMP バリアに固執し、以前と同じように IO を続けます。

そのコードをベンチマーク/時間測定し、IO がパフォーマンスの大きな障壁であることが判明した場合は、最適化を試みます。あなたが提案しているものは、実際には集合バージョンよりもパフォーマンスが悪いことに気付くかもしれません。いずれにせよ、最適化する前に現在のパフォーマンスを定量的に把握してください。

速度がどうしても必要な場合は、各スレッドを個別のファイルに書き込み、後処理でファイルを結合するのが最も速くて簡単な方法の 1 つです。これはかなりハックだと思うので、最後の手段として残します。

于 2012-11-13T07:02:21.983 に答える