这是一场数据竞赛吗?打开MP

Is this a data race? OPENMP

如果存在变量 k 的数据竞争,我会感到有点困惑。据我了解,只有一个线程会执行单个构造,但由于 no wait 已断言,线程将立即开始执行 for 构造。 atomic 是否足以防止任何潜在的数据竞争?

#include <stdio.h>
#include <omp.h>
#define Nthreads 8

void main()
{

int n =9, l,k =n,i,j;
k += n+1;

omp_set_num_threads(Nthreads);

  #pragma omp parallel default(none) shared(n, k) private(j)
  {
   #pragma omp single nowait
    {
    k = k+5;
    }
   #pragma omp for nowait
     for( i =0; i< n; i++)
     {
      #pragma omp atomic
       k +=n+i+1;
     }
  }   
}

假设其余代码正确表达了您的预期算法,几乎就是这样。正如您可能自己怀疑的那样,您还需要在单个区域中保护 k 的更新。

j 是一个未使用的变量,我不知道你是否只是忘记删除它或者你正在尝试实现其他东西。

我会在 for 循环中使用 k 的缩减子句,而不是使用同步构造。我不知道它是否会更好或更快。