2011-11-29 162 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}]