2013-04-13 3 views
4

C++ 11에서 제공하는 RNG를 사용 중이며 OpenMP도 사용 중입니다. 각 스레드에 엔진을 할당했으며 테스트로 각 엔진에 동일한 시드를 제공합니다. 즉, 두 스레드가 임의로 생성 된 숫자의 동일한 시퀀스를 생성 할 것으로 기대합니다. 여기 MWE은 다음과 같습니다동일한 엔진과 병렬로 난수 생성 실패

#include <iostream> 
#include <random> 

using namespace std; 


uniform_real_distribution<double> uni(0, 1); 
normal_distribution<double> nor(0, 1); 


int main() 
{ 
    #pragma omp parallel 
    { 
     mt19937 eng(0); //GIVE EACH THREAD ITS OWN ENGINE 
     vector<double> vec; 

     #pragma omp for 
     for(int i=0; i<5; i++) 
     { 
      nor(eng); 
      vec.push_back(uni(eng)); 
     } 
     #pragma omp critical 
     cout << vec[0] << endl; 
    } 



    return 0; 
} 

대부분의 자주 출력 0.857946 0.857946를 얻을 수 있지만, 몇 번 내가 0.857946 0.592845를 얻을. 두 스레드가 동일하고 상관없는 엔진을 가지고있을 때 후자의 결과는 어떻게 가능합니까?

+0

댓글 : 'nor (eng);'를 포함 할 때만 나타납니다 ... 더 의미가 아니라 ... – BillyJean

답변

6

omp parallel 영역 내에 noruni을 입력해야합니다. 이와 같이 :

#pragma omp parallel 
{ 
    uniform_real_distribution<double> uni(0, 1); 
    normal_distribution<double> nor(0, 1); 
    mt19937 eng(0); //GIVE EACH THREAD ITS OWN ENGINE 
    vector<double> vec; 

그렇지 않으면 실제로 모든 스레드가 자체 복사본을 필요로 할 때 각 하나의 사본 만 존재합니다.

업데이트 : 이제 정확히 같은 문제가 this stackoverflow thread에서 논의됩니다.

+0

답변이 동일한 경우 질문을 중복으로 표시해서는 안됩니다. ; 한 가지 대답이 여러 가지 질문에 대해 작동한다는 것은 의미가 있지만 질문 자체가 다르기 때문에 그것들을 중복으로 표시하는 것은별로 의미가 없습니다. –

+0

@ 카일 : 알았어, 그에 따라 내 대답을 편집 했어. 알았어. – TonyK

+0

. 그러나이 솔루션은 프로그램의 모든 병렬화 된 영역에서 배포 및 엔진을 정의해야한다는 점에서 매우 엄격하게 보입니다. 그 엔진과 배급으로 숫자를 생성하는'for'-loop 함수를 호출하기를 원한다고 가정 해 봅시다 : 그러면 나는 배분 *과 * 엔진을 모두 참조로 전달해야할까요? 즉, 함수의 프로토 타입은'double gen_num (uniform_real_distribution & uni, mt19937 & gen)'을 읽어야 할 것입니다. – BillyJean