ハードウェア・プラットフォームが 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 操作をご覧ください。