OpenMP API仕様バージョンと、C/C++言語向けatomicコンストラクトの制限事項についてメモ。
OpenMP 3.0以前
#pragma omp atomic
new-line
expression-stmt
atomic指示文に続く式 expression-stmt では、スカラ型の左辺値(lvalue)式 x に対する更新操作のみが許容される。binopは+
, *
, -
, /
, &
, ^
, |
, <<
, >>
のいずれかを表す。
x binop= expr; x++; ++x; x--; --x;
OpenMP 3.1以降
#pragma omp atomic [read|write|update|capture]
new-line
expression-stmt
OpenMP v3.1以降ではatomic指示文のオプションとして、read/write/update/capture を指定できるよう拡張された。省略時はupdate指示節が指定されたとみなす。
atomic指示文に続く式 expression-stmt では、指示節に応じてスカラ型の左辺値(lvalue)式 x に対する下記操作が許容される。binopは+
, *
, -
, /
, &
, ^
, |
, <<
, >>
のいずれかを表す。
// read v = x; // write x = expr; // update x binop= expr; x = x binop expr; x = expr binop x; // OpenMP 4.0以降 x++; ++x; x--; --x; // capture v = x++; v = x--; v = ++x; v = --x; v = x binop= expr; v = x = x binop expr; // OpenMP 4.0以降 v = x = expr binop x; // OpenMP 4.0以降
2021-04-21追記:OpenMP 5.1以降ではatomic指示文へのcompare指定でCAS(Compare-and-Swap)操作を記述できるよう拡張された。