2010-08-04 84 views
2

我想用OpenMP在C++中並行化我的boost隨機數生成器代碼。我希望這樣做既有效又線程安全。有人能告訴我這是如何完成的嗎?我現在附上我在下面的內容;這顯然不是線程安全的,因爲sampleNormal函數中的靜態變量很可能會給出競爭條件 。樣本數(nsamples)比n大得多。在OpenMP中使用boost隨機數生成器

#pragma omp parallel for private(i,j) 
for (i = 0; i < nsamples; i++) { 
    for (j = 0; j < n; j++) { 
     randomMatrix[i + nsamples*j] = SampleNormal(0.0, 1.0); 
    } 
} 

double SampleNormal (double mean, double sigma) 
{ 
    // Create a Mersenne twister random number generator 
    static mt19937 rng(static_cast<unsigned> (std::time(0))); 
    // select Gaussian probability distribution 
    normal_distribution<double> norm_dist(mean, sigma); 
    // bind random number generator to distribution 
    variate_generator<mt19937&, normal_distribution<double> > normal_sampler(rng, norm_dist); 
    // sample from the distribution 
    return normal_sampler(); 
} 

回答

2

你只是需要一些線程安全或可以擴展的東西嗎?如果您在PRNG中不需要非常高的性能,則可以圍繞使用rng對象打包鎖。爲了獲得更高的性能,您需要查找或寫入並行僞隨機數生成器 - http://www.cs.berkeley.edu/~mhoemmen/cs194/Tutorials/prng.pdf有關於它們的教程。一種選擇是將你的mt19937對象放在線程本地存儲中,確保爲不同的種子分配不同的線程;這使得在不同的運行中重現相同的結果很困難,如果這對你很重要的話。

+0

給出示例代碼,實際上*整件*是一個隨機數生成器。 – Puppy 2012-01-03 14:29:45