我使用命令civl verify -input_omp_thread_max=2 file.c运行CIVL,它检测到程序中的缺陷。警告是:


  线程1无法执行$ omp_write,因为线程0已写入同一变量且尚未刷新。


但是我听不懂。我认为可能是因为应将全局变体sum添加到flush,但是在执行此操作之后,警告仍然存在。如警告所示,我对该程序是否存在缺陷感到困惑。谢谢你的帮助。

OpenMP程序位于以下位置:

#define N 100

int main (int argc, char *argv[]) {

double a[N], b[N];
double localsum, sum = 0.0;
int i, tid, nthreads;

#pragma omp parallel shared(a,b,sum) private(i, localsum)
{
  /* Initialization */
  #pragma omp for
  for (i=0; i < N; i++)
    a[i] = b[i] = (double)i;

  localsum = 0.0;

  /* Compute the local sums of all products */
  #pragma omp for
  for (i=0; i < N; i++)
    localsum = localsum + (a[i] * b[i]);

  #pragma omp critical //add flush(sum) is useless
  sum = sum+localsum;

 }  /* End of parallel region */

  printf("   Sum = %2.1f\n",sum);
  assert(sum==328350);

  exit(0);
}

最佳答案

您的代码是正确的。 critical区域的开始和结束处都有一个隐式刷新。 CIVL似乎是错误的,尽管我无法复制它。

也就是说,在实践中-使用OpenMP提供的减少量而不是重新发明它。

关于c - CIVL在OpenMP程序中检测到数据争用-是否正确?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51685326/

10-11 22:00