OpenMP 並列コンパイラ指示文:特定のメモリー位置が動的に更新されるようにします。これにより,複数のスレッドが同時に書き込みを行う可能性を避けることができます。
形式
c$OMP ATOMIC
c
次のいずれか:C (または c),!,* (「並列指示文の構文規則」を参照)
規則と振る舞い
ATOMIC 指示文を使うと,代入をクリティカル・セクションで囲む以上の最適化を行うことができます。実装は,個々の文をクリティカル・セクションで囲むことで,ATOMIC 指示文を置き換えることができます。クリティカル・セクションは同じ一意の名前でなくてはなりません。
ATOMIC 指示文は,以下のいずれかの形式を持つ直後の文にのみ適用されます。
x = x operator expr x = expr operator x x = intrinsic (x, expr) x = intrinsic (expr, x)
上の文で,各項目は以下の意味を持ちます。
x は組込み型のスカラ変数です。
expr は,x を引用していないスカラ式です。
intrinsic は,MAX,MIN,IAND,IOR,または IEOR です。
operator は,+,*,-,/,.AND.,.OR.,.EQV.,または .NEQV. です。
記憶位置 x のすべての引用は,同じ型と型パラメタを持っていなくてはなりません。
x のロードと格納だけが動的に行われます。expr の評価は動的ではありません。競合条件 (または並列性の競合) を避けるために,位置に対する並列的な更新は,競合条件が生じないことがわかっているものを除いて,すべて ATOMIC 指示文を使って保護されなくてはなりません。関数 intrinsic,演算子 operator,および代入は,組込み関数,演算子,および代入でなくてはなりません。
関連情報
OpenMP Fortran API コンパイラ指示文,Tru64 UNIX システム用の並列指示文
例
次の例は,ATOMIC を使って,特定の位置に対する複数のスレッドからのすべての同時更新を保護することで,競合条件を防ぐ方法を示しています。
!$OMP PARALLEL DO DEFAULT(PRIVATE) SHARED(X,Y,INDEX,N) DO I=1,N CALL WORK(XLOCAL, YLOCAL) !$OMP ATOMIC X(INDEX(I)) = X(INDEX(I)) + XLOCAL Y(I) = Y(I) + YLOCAL END DO
ATOMIC 指示文はその直後の文にしか適用されないので,Y はアトミックには更新されないということに注意してください。