2011-11-29 17 views
8

複数のモンテカルロカーネルの引数の値が異なるいくつかのモンテカルロ評価を並列に実行するのと同じ機能を実行することに興味があります。私はまた、カーネル間で関数の計算を分散させることなく、関数全体が同じカーネル上で実行されるようにしたい。たとえば、F [M3、M4]、F [M5、M6]、M8、M7 [F [M2、M1]私は今、fを実行したい機能(故意に単純化された)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 [m9、m10]を5つの異なるカーネル上で共有します。つまり、異なるカーネル間で別々の乱数ストリームを使用して情報を転送しません。

Mathematicaではどのようにこれを行うことができますか?

+1

は、私はこの1つを座っています、楽しい男を持っています。 –

+1

@ Mr.Wizard:あなたと競争しようとしていないときは楽しいことではありません:) –

答えて

3

おそらく、個々のカーネルに$KernelID$ProcessIDを付けることができますか?

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

そして、これは、5つの異なるカーネル(FinestGrainedオプションは新しいカーネルにすべての評価を取る)に行く必要があります。i(最大5)がカーネルの数(8よりも大きい場合

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

)これは問題に繋がるでしょう。すなわち、f[13,14]f[2,3]と同じ種を使用します。

+0

これはデフォルトでどうなりますか? [ここでは(http://reference.wolfram.com/mathematica/tutorial/RandomNumberGeneration.html)参照]並列計算の場合、ジェネレータから独立した乱数を生成する各スレッドにジェネレータを持たせることは非常に有利ですMathematicaでは、並列計算で使用される各スレッドには、ゼロから始まる固有のインデックスが与えられます(通常、$ ProcessorCountを順番に実行します)。各スレッドに異なるシードとジェネレータを与えるために使用されます。* – 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}] 
関連する問題