yohhoyの日記

技術的メモをしていきたい日記

atomicコンストラクトの制限

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)操作を記述できるよう拡張された。