我想使用OpenMP并行生成伪随机数,类似于这样:
int i;
#pragma omp parallel for
for (i=0;i<100;i++)
{
printf("%d %d %d\n",i,omp_get_thread_num(),rand());
}
return 0;
我已在Windows上进行了测试,获得了巨大的加速,但每个线程生成的数字完全相同。我还在Linux上进行了测试,发现并行版本在8核处理器上约比顺序版本慢10倍,但每个线程生成的数字不同。
有没有办法既能提升速度又能生成不同的数字?
编辑 27.11.2010
我认为通过借鉴Jonathan Dursi的帖子中的想法,我已经解决了这个问题。似乎以下代码在Linux和Windows上都能快速运行。数字也是伪随机的。您对此有何看法?
int seed[10];
int main(int argc, char **argv)
{
int i,s;
for (i=0;i<10;i++)
seed[i] = rand();
#pragma omp parallel private(s)
{
s = seed[omp_get_thread_num()];
#pragma omp for
for (i=0;i<1000;i++)
{
printf("%d %d %d\n",i,omp_get_thread_num(),s);
s=(s*17931+7391); // those numbers should be choosen more carefully
}
seed[omp_get_thread_num()] = s;
}
return 0;
}
PS.:我还没有接受任何答案,因为我需要确保这个想法是好的。
rand
是一个非常低质量的伪随机数生成器,只有在需要兼容性时才应该使用它(例如为了复制使用此相同糟糕的 PRNG 的模拟运行)。大多数操作系统/库提供更好的 PRNG(例如 FreeBSD 有random
,lrand48
,arc4random
等)。 - Dave C