我将使用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
}
}
}
如您所见,我在并行区域中声明我的随机生成器,以便在堆栈上分配其内存。这种结构以平行方式运行良好,但与此同时存在一个巨大的概念问题:
由于随机生成器对象在每个时间步都被声明,因此它们在每个时间步产生相同的随机数序列,因此粒子的布朗运动没有正确建模。
你认为我必须返回到第一个结构,并尝试修改我下载的库,以便在线程之间没有任何共享的方式生成随机数吗?我希望事实并非如此,因为我不想通过那些代码!
如果有人能帮助我,我将不胜感激。
最佳