这是一场数据竞赛吗?打开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 的缩减子句,而不是使用同步构造。我不知道它是否会更好或更快。
如果存在变量 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 的缩减子句,而不是使用同步构造。我不知道它是否会更好或更快。