具有生成随机数的函数的OpenMP

时间:2015-02-20 01:29:47

标签: function loops dependencies openmp

我将使用OpenMP来平行我的代码,这是通过流体进行粒子运动的代码。为了能够模拟粒子的布朗运动,我使用了一个免费的随机生成器库。我有一个随机生成器类的对象:

Class_rand Obj_rand;

我可以调用以下成员函数来获取随机值:

Obj_rand.Func_rand();

我的代码部分应该并行化的结构如下:

Class_rand Obj_rand;
...
for (all of the time steps){
  //some tasks are done just by the master root

  #pragma omp parallel
  {
    //declaration all of the required private variables

    for (all of the particles : each thread is tasked with solving a set of particles' equations)
    {
       //some tasks are done

       this_rand_value = Obj_rand.Func_rand();

       //some tasks are done: particles position and velocity are updated
    }
  }
}

对于这种结构,我得到分段错误,这是因为对象Obj_rand在所有线程之间共享,所以显然不应该工作。因此,我稍微调整了我的代码结构:

for (all of the time steps){
  //some tasks are done just by the master root

  #pragma omp parallel
  {
    //declaration all of the required private variables

    Class_rand Obj_rand;

    for (all of the particles : each thread is tasked with solving a set of particles' equations)
    {
       //some tasks are done

       this_rand_value = Obj_rand.Func_rand();

       //some tasks are done: particles position and velocity are updated
    }
  }
}

如您所见,我在并行区域中声明我的随机生成器,以便在堆栈上分配其内存。这种结构以平行方式运行良好,但与此同时存在一个巨大的概念问题:

由于随机生成器对象在每个时间步都被声明,因此它们在每个时间步产生相同的随机数序列,因此粒子的布朗运动没有正确建模。

你认为我必须返回到第一个结构,并尝试修改我下载的库,以便在线程之间没有任何共享的方式生成随机数吗?我希望事实并非如此,因为我不想通过那些代码!

如果有人能帮助我,我将不胜感激。

最佳

0 个答案:

没有答案