在loop_C ++中生成随机数,在循环中生成数组(openmp)

时间:2017-11-21 10:38:44

标签: c++ openmp

我最近学习了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
     }
     }
  1. 上面的代码会导致数据争用或其他问题,因为x和y是共享变量吗?
  2. 在foor循环中创建的随机数是否会导致任何问题?如果是,我该如何避免这个问题?

1 个答案:

答案 0 :(得分:1)

代码段有数据争用,但不是因为xy。比赛是在随机数发生器上进行的。

当且仅当存在对同一对象(内存位置)的并发访问时才会发生数据争用其中一个访问是写入(修改)。

由于对xy的数组子对象的访问是互斥的,因此此处不会发生数据争用。随机数生成器将始终在生成时改变其状态,因此是数据竞争。