我最近学习了oenmp,我有两个主要问题。考虑一下简单的例子:
using namespace std;
std::minstd_rand gen(std::random_device{}());
std::uniform_real_distribution<double> unirnd(0, 1);
int main(){
double eta=something;
double x[N],y[N];
//initializing x[] and y[]...
for (i=0;i<N;i++)
{
double z= unirnd(gen) * eta;
x[i] = some function of x[i] and y[i] and z
}
}
我做了如下:
using namespace std;
std::minstd_rand gen(std::random_device{}());
std::uniform_real_distribution<double> unirnd(0, 1);
int main(){
double eta=something;
double x[N],y[N];
//initializing x[] and y[]...
#pragma omp parallel for
for (i=0;i<N;i++)
{
double z = unirnd(gen) * eta;
x[i] = some function of x[i] and y[i] and z
}
}
答案 0 :(得分:1)
代码段有数据争用,但不是因为x
和y
。比赛是在随机数发生器上进行的。
当且仅当存在对同一对象(内存位置)的并发访问时才会发生数据争用和其中一个访问是写入(修改)。
由于对x
和y
的数组子对象的访问是互斥的,因此此处不会发生数据争用。随机数生成器将始终在生成时改变其状态,因此是数据竞争。