我想使用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;
我測試過它的窗戶,我得到了極大的加速,但是產生的每個線程完全一樣的數字。我已經在Linux上測試過它,並且我得到了巨大的減速,8核處理器上的並行版本比順序版慢了10倍,但是每個線程產生了不同的數字。
有沒有辦法讓加速和不同的數字?
編輯2010年11月27日
我想我已經用從喬納森·德西后的想法解決它。看起來下面的代碼在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:我還沒有接受任何答案,因爲我需要確定這個想法是好的。
幾乎可以肯定的是,如果沒有檢查種子是否在所有線程上初始化的邏輯,這將不會消除Linux上的減速。 – 2010-11-26 18:05:43
說明:http://software.intel.com/en-us/blogs/2009/11/05/use-of-rand-in-openmp-parallel-sections/ – chrisaycock 2010-11-26 18:12:04
@Axel這可能是因爲rand()有一個它鎖定的原子操作。你將不得不尋找一個非鎖定的RNG。 – marcog 2010-11-26 18:26:40