带有循环的原子指令 openmp
Atomic directive openmp with loops
是否可以将原子指令用于单个 for 循环
例如:
#pragma omp atomic
for (i=0;i<5;i++)
A[i]++;
不行,这个不行
从技术上讲,atomic
构造适用于对特定存储位置的访问。根据标准的 2.13.6,以下语句是 omp atomic
(C/C++)的有效表达式:
如果 atomic-clause 是 read
:
v = x;
如果 atomic-clause 是 write
:
x = expr;
如果 atomic-clause 是 update
或不存在:
x++; (and -- as well as prefix forms)
x binop= expr;
x = x binop expr;
x = expr binop x;
如果 atomic-clause 是 capture
:
v = x++; (and -- as well as prefix forms)
v = x binop= expr;
v = x = x binop= expr;
v = x = expr binop= x;
在这种情况下,允许使用一些特定的结构化块:
{v = x; x++;}
{x++; v = x;}
以及更新形式与v = x
的所有组合
该标准进一步明确地将 x
和 v
限制为标量类型,因此不允许使用向量/数组类型,即使您要实现 operator=
.
如果你想让这个更新以原子方式出现,你必须保护整个更新和对 A
的所有访问,使用临界区、锁,或以其他方式确保不执行任何并发访问,并且保证内存可见性。如果没有更具体的代码,我无法给出更具体的建议。
是否可以将原子指令用于单个 for 循环
例如:
#pragma omp atomic
for (i=0;i<5;i++)
A[i]++;
不行,这个不行
从技术上讲,atomic
构造适用于对特定存储位置的访问。根据标准的 2.13.6,以下语句是 omp atomic
(C/C++)的有效表达式:
如果 atomic-clause 是
read
:v = x;
如果 atomic-clause 是
write
:x = expr;
如果 atomic-clause 是
update
或不存在:x++; (and -- as well as prefix forms) x binop= expr; x = x binop expr; x = expr binop x;
如果 atomic-clause 是
capture
:v = x++; (and -- as well as prefix forms) v = x binop= expr; v = x = x binop= expr; v = x = expr binop= x;
在这种情况下,允许使用一些特定的结构化块:
{v = x; x++;} {x++; v = x;}
以及更新形式与
v = x
的所有组合
该标准进一步明确地将 x
和 v
限制为标量类型,因此不允许使用向量/数组类型,即使您要实现 operator=
.
如果你想让这个更新以原子方式出现,你必须保护整个更新和对 A
的所有访问,使用临界区、锁,或以其他方式确保不执行任何并发访问,并且保证内存可见性。如果没有更具体的代码,我无法给出更具体的建议。