带有循环的原子指令 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-clauseread:

    v = x;
    
  • 如果 atomic-clausewrite:

    x = expr;
    
  • 如果 atomic-clauseupdate 或不存在:

    x++; (and -- as well as prefix forms)
    x binop= expr;
    x = x binop expr;
    x = expr binop x;
    
  • 如果 atomic-clausecapture:

    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

  • 的所有组合

该标准进一步明确地将 xv 限制为标量类型,因此不允许使用向量/数组类型,即使您要实现 operator=.

如果你想让这个更新以原子方式出现,你必须保护整个更新和对 A 的所有访问,使用临界区、锁,或以其他方式确保不执行任何并发访问,并且保证内存可见性。如果没有更具体的代码,我无法给出更具体的建议。