ハードウェア・プラットフォームが atomic 操作をサポートする場合、OpenMP* の atomic 操作を使用すると、複数のスレッドが安全に共有数値変数を更新できます。atomic 操作は直後の単一の代入文にのみ適用されます。そのため、細粒度の同期が必要なコードに適しています。
保護する文の前に、以下を追加します。
#pragma omp atomic (C/C++)
!$omp atomic (Fortran)
例えば、次のアノテーション付きの C/C++ シリアルコードについて考えてみます。
int count; void Tick() { ANNOTATE_LOCK_ACQUIRE(0); count = count+1; ANNOTATE_LOCK_RELEASE(0); } ...
#include <omp.h> と #pragma omp atomic を追加した並列 C/C++ コード:
#include <omp.h> // .dll を検出できないロード時の問題を解決します int count; void Tick() { // ロック・アノテーションと入れ替えます #pragma omp atomic count = count+1; } ...
次のようなアノテーション付きの Fortran シリアルコードについて考えてみます。
program ABC integer(kind=4) :: count = 0 .. contains subroutine Tick call annotate_lock_acquire(0) count = count + 1 call annotate_lock_release(0) end subroutine Tick .. end program ABC
use omp_lib と !$omp atomic ディレクティブを追加した並列 Fortran コード。
program ABC use omp_lib integer(kind=4) :: count = 0 ... contains subroutine Tick !$omp atomic count = count + 1 end subroutine Tick ... end program ABC
インテル® Advisor の Fortran サンプル nqueens.f90 は、atomic 操作の使用例を示しています。
ここでは基本的な OpenMP* の atomic 操作について説明しました。atomic 構文の後に節を指定する高度な atomic 操作については、高度な OpenMP* の atomic 操作をご覧ください。