高性能コンピューティング--OpenMP


OpenMPの概要
OpenMPは歴史の長い並列ツールであるべきでしょう.少なくとも私が最初に知っていたのは、共有ストレージ基準として、マルチプロセッサマルチコアのデバイス上で並列プログラムを記述するために設計されたアプリケーションプログラミングインターフェースであり、コンパイル言語とサポートされている関数ライブラリを含む.上記は比較的公式な言葉で、私にとって、2つの利点があります.1つは標準的なC/C+(Fortranを加えた)と組み合わせて仕事をすることができ、基本的な応用が簡単で、勉強しやすい(毛皮に限られています).二つ目は、プラットフォーム間でサポートすることであり、VSでは属性を編集することで直接この機能をオンにすることができ、Linuxはヘッダファイルを含むだけでよい.gcc、g++コンパイラをサポートすることで、インストール構成の難しさを低減することができる.
OpenMPコンパイル指導文
  簡単な紹介の下でOpenMPコンパイル指導文:
  • parallelは、コードセグメントの前に使用され、コードが複数のスレッドによって並列に
  • 実行可能であることを示す.
  • forはC/C++標準のforループの前に使用されるが、各ループ間には相関がない必要があり、これにより各スレッドに割り当てて
  • を実行することができる.
  • parallel for字面意味parallel+forの組合せ
  • sectionsは、コードセグメントの前に、
  • が並列に実行される可能性がある.
  • parallel sections名前の通りparallel+sectionsの組合せ
  • criticalコード臨界領域の前(まだ使用されていない)
  • singleコードセグメントが単一のスレッドでしか実行できない場合、この文
  • を使用します.
    その他にも、重要な関数がいくつかあります.
  • omp_get_num_procsはプロセッサの個数
  • を返す
  • omp_get_num_threads戻りスレッド数
  • omp_get_thread_numはスレッドインデックス番号
  • を返す
  • omp_set_num_threads指定スレッド数
  • 動作モード
      OpenMPでは、標準的なパラレルモードはfork/joinモードであり、単純に1つのプライマリスレッド(一般的にはシリアルで実行される)しかなく、パラレル実行が必要な場合には複数のスレッドが派生(fork)され、この場合、プライマリスレッドはこれらの派生スレッドと協働して動作し、パラレルコードセグメントの実行が終了すると、派生スレッドが保留され、制御フローはメインスレッドに戻り、プログラム全体が完了したことを知っています.(後で図の説明を添付します)
    言語の概要
    parallel for
      現在のアプリケーションから見ると、この組み合わせは半分を占めているので、よく見る必要があります.まず、前の例のコードです.
    #  for    
    int b[300]
    #pragma omp parallel for
        for(int i = 0; i < 300; i++)
            b[i] = i;

    上記のコードはこのforサイクルの並列化を完了し、比較的簡単で、よく使われていますが、二重サイクルに使われることもあります.これはコードを進化させる必要があります.
    #    
    #pragma omp parallel for private(j)
        for(int i = 0; i < 100; i++)
            for(int j = 0; j < n; j++)
                a[i][j] = j;

    二重ループは少し難しいので、説明する必要があります.parallel forは説明する必要はありません.privateはプライベート変数を宣言し、jの独立性を保証し、他のスレッドがこの変数にアクセスできないようにします.
    機能並列
      parallel for及びその付属は半壁江山を占めているが、残りの半壁江山は間もなく紹介される:parallel sections、この方法は機能並列を実現するためであり、簡単に言えば、スレッドa実現機能A、スレッドb実現機能Bを割り当てることができる......すべてが完了したら、プライマリ・スレッドに統合します.
    #       
    #pragma omp parallel sections
    {
    #pragma omp section
        {
            a = A;
        }
    #pragma omp section
        {
            b = B;
        }
    }
    

    このうち、#pragma omp sectionでは独立した機能を有するコードブロックが実行され、柔軟に使用することができる.