我使用命令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/