2011-11-29 4 views
8

여러 개의 커널에있는 인자의 값이 서로 다른 몬테카를로와 동일한 함수를 병렬 함수로 실행하는 데 관심이 있습니다. 필자는 커널 내에서 함수가 계산되지 않고 동일한 커널에서 전체 함수가 실행되도록하고 싶습니다. 예를 들어, I는 (의도적 간체) 함수가 있다고 가정Mathematica에서의 병렬 프로그래밍

f[a_, b_] := Module[{}, RandomReal[{a, b}]] 


In[1]:= LaunchKernels[] 

Out[1]= {KernelObject[1, "local"], KernelObject[2, "local"], 
KernelObject[3, "local"], KernelObject[4, "local"], 
KernelObject[5, "local"], KernelObject[6, "local"], 
KernelObject[7, "local"]} 

SeedRandom[795132, Method -> "ParallelGenerator"]; 

m1 = 1; m2 = 2; m3 = 3; m4 = 4; m5 = 5; m6 = 6; m7 = 7; m8 = 8; 

DistributeDefinitions[f, m1, m2, m3, m4, m5, m6, m7, m8]; 
지금 F [m2 (M1)], F [M3, M4, F [M6 (M5)], F [M7, M8을 실행할

] f [m9, m10]을 5 개의 서로 다른 커널에서 전송할 수 있습니다. 즉, 서로 다른 커널에서 서로 다른 난수 스트림을 사용하여 정보를 전송하지 않아도됩니다.

Mathematica에서 어떻게 이것을 할 수 있습니까?

+1

재미 사람을, 나는이 일을 앉고있다. –

+1

@ Mr.Wizard : 비록 당신이 경쟁 할 때 재미가 없다. :) –

답변

3

아마도 $KernelID$ProcessID으로 개별 커널을 시드 할 수 있습니까?

ParallelEvaluate[ 
Print[$KernelID $ProcessID]; 
SeedRandom[$KernelID $ProcessID] 
] 

그리고이 다섯 가지 커널로 이동해야합니다 (FinestGrained 옵션은 새로운 커널에 모든 평가 소요) :

ParallelTable[$KernelID -> f[2 i - 1, 2 i], {i, 5}, Method -> "FinestGrained"] 

i (최대 5) 커널의 수보다 큰 (8), 이것은 문제가 될 것입니다. 즉, f[13,14]일 수 있습니다.f[2,3]과 동일한 시드를 사용합니다.

+0

이것이 기본값이 아니니? [여기] (http://reference.wolfram.com/mathematica/tutorial/RandomNumberGeneration.html) 참조. "병렬 계산의 경우 생성기와 독립적 인 난수를 생성하는 각 스레드에 생성기를 갖는 것이 매우 유리합니다 Mathematica에서 병렬 계산에 사용되는 각 쓰레드는 각 쓰레드마다 서로 다른 씨드와 생성자를주기 위해 사용되는 0부터 시작하는 순차적 인 인덱스를 제공받을 것입니다. * – Szabolcs

+0

함수 내의 모든 계산은 동일한 커널에서 발생합니다. 함수에 여러 (무작위로 10000 개) 무작위 추출이 포함되는 경우 모두 동일한 스트림에서 가져와야합니다. – asim

2

나는 당신이 찾고있는 것이 BlockRandom이라고 생각합니다. documentation에 따르면

,

BlockRandom[expr] 
evaluates expr with all pseudorandom generators localized, 
so that uses of SeedRandom, RandomInteger, and related functions 
within the evaluation of expr do not affect subsequent pseudorandom sequences. 

그런 다음 당신이있을 수 있습니다 :

f[a_, b_] := BlockRandom[{}, RandomReal[{a, b}] 
관련 문제