高性能コンピューティング--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
現在のアプリケーションから見ると、この組み合わせは半分を占めているので、よく見る必要があります.まず、前の例のコードです.
上記のコードはこの
二重ループは少し難しいので、説明する必要があります.
機能並列
このうち、
OpenMPは歴史の長い並列ツールであるべきでしょう.少なくとも私が最初に知っていたのは、共有ストレージ基準として、マルチプロセッサマルチコアのデバイス上で並列プログラムを記述するために設計されたアプリケーションプログラミングインターフェースであり、コンパイル言語とサポートされている関数ライブラリを含む.上記は比較的公式な言葉で、私にとって、2つの利点があります.1つは標準的なC/C+(Fortranを加えた)と組み合わせて仕事をすることができ、基本的な応用が簡単で、勉強しやすい(毛皮に限られています).二つ目は、プラットフォーム間でサポートすることであり、VSでは属性を編集することで直接この機能をオンにすることができ、Linuxはヘッダファイルを含むだけでよい.gcc、g++コンパイラをサポートすることで、インストール構成の難しさを低減することができる.
OpenMPコンパイル指導文
簡単な紹介の下でOpenMPコンパイル指導文:
その他にも、重要な関数がいくつかあります.
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
では独立した機能を有するコードブロックが実行され、柔軟に使用することができる.