Wolfram mathematica Mathematica中的并行编程

Wolfram mathematica Mathematica中的并行编程,wolfram-mathematica,Wolfram Mathematica,我感兴趣的是以并行方式运行相同的函数,该函数使用多个内核上不同的参数值进行蒙特卡罗计算。我还想确保整个函数在同一个内核上运行,而函数中的计算不会跨内核分布。例如,假设我有一个函数(故意简化) 现在我想在五个不同的内核上运行f[m1,m2],f[m3,m4],f[m5,m6],f[m7,m8]f[m9,m10],这些内核之间没有信息传输,也就是说,在不同的内核上有一个单独的随机数流 在Mathematica中如何做到这一点?也许您可以使用$KernelID和$ProcessID为单个内核播种 Pa

我感兴趣的是以并行方式运行相同的函数,该函数使用多个内核上不同的参数值进行蒙特卡罗计算。我还想确保整个函数在同一个内核上运行,而函数中的计算不会跨内核分布。例如,假设我有一个函数(故意简化)

现在我想在五个不同的内核上运行f[m1,m2],f[m3,m4],f[m5,m6],f[m7,m8]f[m9,m10],这些内核之间没有信息传输,也就是说,在不同的内核上有一个单独的随机数流


在Mathematica中如何做到这一点?

也许您可以使用
$KernelID
$ProcessID
为单个内核播种

ParallelEvaluate[
 Print[$KernelID $ProcessID];
 SeedRandom[$KernelID $ProcessID]
]
这应该是五种不同的内核(FinestGrained选项将每次计算都带到一个新内核):


i
(最大5)大于内核数(8)时,这将遇到问题,即
f[13,14]
可能使用与
f[2,3]

相同的种子。我相信您要找的是
BlockRandom

据报道,

那么你可能会:

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

玩得开心,伙计们,我坐在这里。@Mr.Wizard:当你不在身边与之竞争时,这不是很有趣:)这不是默认情况下发生的吗?请看,它说“对于并行计算,在每个线程上都有一个生成器,该生成器生成的随机数独立于其他线程上的生成器,这是非常有利的。在Mathematica中,并行计算中使用的每个线程都将被赋予一个从零开始的唯一索引(通常按顺序通过$ProcessorCount)这将用于在每个线程上提供不同的种子和生成器。”我希望一个函数中的所有计算都发生在同一个内核上。如果函数涉及多个(比如10000个)随机抽取,那么所有抽取都应该来自同一个流。
ParallelTable[$KernelID -> f[2 i - 1, 2 i], {i, 5}, Method -> "FinestGrained"]
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}]