OpenMP* ATOMIC 変数の一貫性のない型

同じ格納位置へのすべての ATOMIC 参照には同じ型が使用されなければなりません。

OpenMP* 仕様では、プログラムのどの場所でも、ATOMIC 代入の左辺にある同じ格納位置へのすべての参照で、互換性のある型を使用する必要があります。異なる型で同じストレージへの参照を許可する構造 (C 共用体または FORTRAN EQUIVALENCE) は一貫して使用されなければなりません。このエラーは、この規則に違反していることを示します。

ATOMIC 構造は、変数を読み取り、新しい値を計算し、その値を格納する文に常に適用されます。ATOMIC を追加することで、読み取りと書き込みの間にほかのスレッドが別の ATOMIC 領域で同じ場所の読み取りと書き込みを行えないようにします。この制限により、この種のロックに関連する処理を効率良く行うことができます。例えば、整数のアトミック更新を実行するスレッドがあるとします。アクセス権を付与する前に、システムはほかのスレッドが現在同じ場所でアトミック更新を行っていないことを確認しなければなりません。この場合、同じ型のほかのアトミック更新にのみ注意を払う必要があります。

ID

問題箇所

説明

1

OpenMP* の使用方法に関するエラー

エラーが検出された ATOMIC 構造

2

OpenMP* の使用方法に関するエラー

異なる型を使用して同じアドレスにアクセスする別の ATOMIC 構造


// Example A.20.1c from OpenMP* 3.0 Specification
// Copyright (C) 1997-2008 OpenMP Architecture Review Board
void a20_1_wrong ()
{
   union {int n; float x;} u;
   #pragma omp parallel
   {
       #pragma omp atomic
       u.n++;
       #pragma omp atomic
       u.x += 1.0;
       /* Incorrect because the atomic constructs reference
       the same location through incompatible types */
   }
}
        
次に FORTRAN の同様の例を示します。

! Example A.20.1f from OpenMP* 3.0 Specification
! Copyright (C) 1997-2008 OpenMP Architecture Review Board
SUBROUTINE A20_1_WRONG()
    INTEGER:: I
    REAL:: R
    EQUIVALENCE(I,R)
    !$OMP PARALLEL
    !$OMP ATOMIC
        I = I + 1
    !$OMP ATOMIC
        R = R + 1.0
    ! incorrect because I and R reference the same location
    ! through incompatible types
    !$OMP END PARALLEL
END SUBROUTINE A20_1_WRONG
        

Note icon

この例は、OpenMP* 3.0 仕様からのもので、次のように著作権が保護されています。

© 1997-2008 OpenMP Architecture Review Board.

この資料は、OpenMP Architecture Review Board の著作権と本ドキュメントのタイトルが記載され、OpenMP Architecture Review Board の許諾に基づく転載である旨が明記されている場合に限り、無料で一部または全体を転載できます また、転載は OpenMP Architecture Review Board の許諾に基づいて行われたことを明記する必要があります。

© 2010 Intel Corporation. 無断での引用、転載を禁じます。