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中做到这一点?
也许你可以用$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]
。
归档时间: |
|
查看次数: |
1200 次 |
最近记录: |