2010-08-04 3 views
2

OpenMP로 C++에서 부스트 난수 생성기 코드를 병렬 처리하고 싶습니다. 효율적이고 스레드 안전성이있는 방식으로 처리하고 싶습니다. 누군가가이 일을 어떻게 처리하는지에 대한 조언을 해줄 수 있습니까? 나는 현재 내가 가지고있는 것을 감싸고있다. sampleNormal 함수의 정적 변수가 에 경쟁 조건을 부여 할 가능성이 있으므로 스레드 안전성이 보장되지 않습니다. 샘플 수 (nsamples)는 n보다 훨씬 큽니다.OpenMP에서 부스트 난수 생성기 사용

#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