2011-11-29 163 views
8

我對以並行方式運行多個內核參數的不同值進行monte carlo評估的相同函數感興趣。我還希望確保整個函數在同一個內核上運行,而不在內核之間分配函數內的計算。例如,假設我有一個函數(故意簡化)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 [M1,M2]中,f [M3,M4]中,f [M5,M6]中,f [M7,M8 ] f [m9,m10],這些內核之間沒有信息傳遞,也就是說,在不同內核之間有一個單獨的隨機數據流。

在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中,並行計算中使用的每個線程都將被賦予一個從零開始的唯一索引(並且通常順序通過$ 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}]