Function 具有生成随机数功能的OpenMP

Function 具有生成随机数功能的OpenMP,function,loops,dependencies,openmp,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 th

我将使用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
    }
  }
}
对于这种结构,我得到了分段错误,这是因为对象对象对象在所有线程之间共享,所以它显然不应该工作。因此,我稍微调整了代码的结构:

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
    }
  }
}
如您所见,我在并行区域声明随机生成器,以便在堆栈上分配其内存。该结构以并行方式运行良好,但同时存在一个巨大的概念问题:

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

您认为我必须返回到第一个结构,并尝试修改我下载的用于生成随机数的库,这样它就不会在线程之间共享任何内容了吗?我希望情况不是这样,因为我不喜欢看那些代码

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


最好在每一步使用一个全局PRNG为线程本地PRNG种子。将对global.Func_rand的调用放入OpenMP关键构造中,以防止其崩溃。确保使用高质量的PRNG,例如MT19937,以防止相关性。非常感谢。。。这是一个绝妙的想法,而且效果非常好,但我决定声明一个RNG对象的指针,这样每个线程都有自己的对象。通过这种方式,它们不会相互干扰,我也不必使用critical,所以速度会快一点!再次感谢。如果您担心结果的有效性,您需要确保每个线程中的随机数生成器生成不相交的流,否则您只需对同一空间进行多次采样,从而使结果产生偏差。选择随机或线程相关种子来初始化随机数生成器并不能保证这一点。想要获得灵感,请访问www.thesalmons.org/john/random123/papers/random123sc11.pdfThanks Jim。我所做的是给线程分配几个不同的随机数序列;我生成了几对种子,因为我的RNG为不同的线程初始化了两个种子,我检查了每个线程的前十个随机数。。。它们在不同的线程之间是不同的。。。你认为有些事情可能仍然有问题吗?是的,当然可能仍然是错误的。你们需要证明你们得到的是不相交的序列,而不仅仅是看一些子序列。其中一个流的前缀可能有十个,然后与另一个流相同!。这不是实验,而是证据。您需要一个具有足够大的状态空间的随机数生成器,以及一个boost函数,以便能够保证在每个线程中对状态空间的不同部分进行采样。