Mathematica中的并行编程

asi*_*sim 8 wolfram-mathematica

我感兴趣的是运行相同的函数,以并行方式使用mulitple内核上的参数的不同值来执行一些蒙特卡罗评估.我还想确保整个函数在同一个内核上运行,而不会在函数内的计算分布在内核中.例如,假设我有一个功能(故意简化)

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];
Run Code Online (Sandbox Code Playgroud)

我现在想在五个不同的内核上运行f [m1,m2],f [m3,m4],f [m5,m6],f [m7,m8] f [m9,m10],这些内核之间没有信息传递,即,在不同内核上使用单独的随机数流.

如何在Mathematica中做到这一点?

Arn*_*ing 3

也许你可以用$KernelID和播种单个内核$ProcessID

ParallelEvaluate[
 Print[$KernelID $ProcessID];
 SeedRandom[$KernelID $ProcessID]
]
Run Code Online (Sandbox Code Playgroud)

这应该进入五个不同的内核(FinestGrained 选项将每次评估都带到一个新内核):

ParallelTable[$KernelID -> f[2 i - 1, 2 i], {i, 5}, Method -> "FinestGrained"]
Run Code Online (Sandbox Code Playgroud)

i(最大 5)大于内核数量(8)时,这会遇到问题,即f[13,14] 可能使用与 相同的种子f[2,3]