2012-04-06 4 views
2

parfor 루프에 스크램블링 된 준 몬테 카를로 수를 생성하는 데 문제가 있습니다.Parfor 루프에서 스크램블 된 준 몬테 카를로 수 생성 문제

문제는 내가 parfor 루프 내에서이 숫자의 여러 세트를 생성 할 때 각 세트의 숫자가 동일하다는 것입니다. 나는 아래에 아주 간단한 예제를 포함하고있다.

D = 3; 
M = 1000; 
numbers = cell(1,4); 

mystream = qrandstream(scramble(sobolset(D),'MatousekAffineOwen')); 
myfun = @(x) qrand(mystream,x); 

parfor i = 1:4 
    numbers{i} = myfun(M); 
end 

문제를 설명하기 위해 코드를 실행 한 후, 숫자의 숫자는 {1}, 숫자는 {2}, 숫자는 {3}와 숫자 {4} 인 동일한로서 :

>>numbers{1}(1:3,:) 
ans = 
      0.76   0.05   0.77 
      0.33   0.96   0.23 
      0.60   0.72   0.52 

>> numbers{2}(1:3,:) 
ans = 
      0.76   0.05   0.77 
      0.33   0.96   0.23 
      0.60   0.72   0.52 

나는 누군가가이 문제에 대한 해결책을 생각할 수 있는지 궁금해. 정상적인 무작위의 숫자를 사용할 때 문제가 발생하지 않기 때문에 제가 할 수있는 일이 있어야한다고 생각합니다.

준 (準) 난수 스트림의 '건너 뛰기'또는 '도약'속성을 악용 할 수 없음을 언급해야합니다. 그 이유는 위의 코드 스 니펫을 병렬로 실행되는 큰 MATLAB 프로그램에서 사용하기 때문입니다 ...

답변

4

각 병렬 작업자에 대해 별도로 호출해야합니다. 이것은 조작과 parfor 루프 내부 qrandstream 관련된 문장을 이동시킴으로써 행해질 수있다 :

D = 3; 
M = 1000; 
numbers = cell(1,4); 

parfor i = 1:4 
    mystream = qrandstream(scramble(sobolset(D),'MatousekAffineOwen')); 
    myfun = @(x) qrand(mystream,x); 

    numbers{i} = myfun(M); 
end 

이유 : MatousekAffineOwen는 랜덤 스크램블링 순서가 없지만 는 MATLAB 거대한 미리 정의 된 어레이로서 의사 - 랜덤 시퀀스를 처리하고 샘플 데이터는 새로운 샘플이 필요할 때마다 즉시 계산됩니다. 스크램블링은이 순서를 변경하지만 qrandstream 객체는 스크램블이 호출 되 자마자 한 번 발생했습니다. 그 다음, qrandstream은 결정 론적 인 숫자의 흐름입니다. 병렬이 아닌 코드에서 (또는 matlabpool을 처음 활성화하지 않고 parfor를 사용하는 경우)이 설정은 단일 qrandstream b/c로 잘 작동합니다. MATLAB은 qrand를 호출 할 때마다 (가상) 목록을 계속 작업합니다.

그러나 parfor에서 모든 필요한 변수, 함수 등의 복사본이 각 작업자에게 전달됩니다. 결과적으로 각 작업자는 중복 된 미리 결정된 의사 난수 스트림을 가져 와서 각 작업자의 샘플 스트림을 동일하게 만듭니다. 부수적으로 이것은 모든 수 {i}가 동일한 값을 가질 것이라는 의미는 아닙니다. 병렬 작업자 (기계 코어)의 수보다 큰 parfor 루프 범위의 경우 동일한 작업자에서 여러 루프 반복이 발생하므로 동일한 비 반복 qrandstream을 공유합니다. 내 두 핵심 시스템에서 귀하의 4 반복 예제 코드 numbers{1}==numbers{4}numbers{2}==numbers{3}

함께이 동작을 보여줍니다.
관련 문제