OpenMP* はいくつかの同期方式を提供します。
critical セクションは、複数のスレッドがクリティカルなコード領域を同時に実行するのを防止し、1 つのアクティブなスレッドのみがコードで参照されているデータを更新します。critical セクションは、1 つ以上の文で構成されます。critical セクションを実装するには次のことを行います。
C/C++ の場合: #pragma omp critical
Fortran の場合: !$omp critical と !$omp end critical を使用します。
入れ子になっていないミューテックスには、 (C/C++) #pragma omp critical(name) または (Fortran) !$omp critical(name) および !$omp end critical(name) などのオプションの名前付き形式を使用します。オプションの (name) を省略すると、単一の名前なしグローバル・ミューテックスがロックされます。共有ミュータックスが容認できないパフォーマンスの問題を引き起こさない場合、最も簡単なアプローチは名前なしの形式を使用することです。
ハードウェア・プラットフォームがサポートする場合、atomic 操作を使用すると、複数のスレッドが安全に共有数値変数を更新できます。atomic 操作は、直後の単一文にのみ適用されます。atomic 操作を実装するには次の操作を行います。
C/C++ では、保護する文の前に #pragma omp atomic を挿入します。
Fortran では、保護する文の前に !$omp atomic を挿入します。
保護する文は特定の基準を満たしている必要があります (使用するコンパイラーや OpenMP* のドキュメントを参照してください)。
ロックは、低レベルの汎用ロックを提供します。ロックを実装するには、OpenMP* タイプ、変数、および関数を使用して、より柔軟性のある強力なロックを提供します。例えば、C/C++ では omp_lock_t タイプ、Fortran では type=omp_lock_kind を使用します。これらの型と関数は容易に使用でき、インテル® Advisor のロック・アノテーションと直接置き換えできます。
リダクション操作は、共有数値変数のインクリメントや配列の共有数値変数値への累積など、単純な操作に使用できます。リダクション操作を実装するには、reduction 節を並列領域内に追加し、指定された操作と変数を使用して並列に合計操作を行うことをコンパイラーに指示します。
OpenMP* は、スレッドがお互いに待機し合う barrier 構文、並列化されたループの構造化ブロックのシーケンシャル実行を指定する ordered 構文、およびマスタースレッドのみが実行する master 構文など、さまざまな同期メカニズムを提供します。詳細は、コンパイラーまたは OpenMP* のドキュメントを参照してください。
以下のトピックでは、これらの同期について説明しています。詳細は使用するコンパイラーのドキュメントを参照してください。