Parallel processing 在不同的内核上运行Mathematica进程

Parallel processing 在不同的内核上运行Mathematica进程,parallel-processing,wolfram-mathematica,Parallel Processing,Wolfram Mathematica,我需要执行几个操作,每次运行一个操作都需要几个小时才能完成。由于我有8个内核,我应该能够同时运行它们,而不是一个接一个地运行。然而,我无法找到一种方法来指示mathematica自动单独运行它们,或者在core X上运行每一个,我手动设置它们的位置,这样它们就不会重叠。这些是完全独立的函数,恰好需要立即运行,而不是任何类型的类似操作组,如并行性文档示例中所示(在这种情况下,函数是一组复杂的不相关符号积分,但如果是非特定的,则答案将更通用).这在某种程度上取决于您正在做什么,但通常您可以使用类似于

我需要执行几个操作,每次运行一个操作都需要几个小时才能完成。由于我有8个内核,我应该能够同时运行它们,而不是一个接一个地运行。然而,我无法找到一种方法来指示mathematica自动单独运行它们,或者在core X上运行每一个,我手动设置它们的位置,这样它们就不会重叠。这些是完全独立的函数,恰好需要立即运行,而不是任何类型的类似操作组,如并行性文档示例中所示(在这种情况下,函数是一组复杂的不相关符号积分,但如果是非特定的,则答案将更通用).

这在某种程度上取决于您正在做什么,但通常您可以使用类似于
Parallelize
ParallelTable
paralleleevaluate
等命令。在
paralleleevaluate
命令中,您可以选择指定内核

您可以用一种非常基本的方式比较这三种:

Clear[a]
a[n_] := a[n] = RandomInteger[10^75]; (*Adjust exponent at your discretion*)
Timing[FactorInteger /@ Table[a[n], {n, 1, 4}]]
Timing[Parallelize[FactorInteger /@ Table[a[n], {n, 1, 4}]]]
%[[2]]==%%[[2]]
如果要使用
paralleleevaluate
,您将启动独立运行的内核(这将使上面的头对头比较有点棘手)

因此,对于您的应用程序,您可能有如下内容:

h[n_][x_] := Integrate[E^t*t^n, {t, 0, n x}]
Timing[Table[FullSimplify[h[n][x]], {n, 1, 10}]]
Timing[ParallelTable[FullSimplify[h[n][x]], {n, 1, 10}]]

即使在这个简单的例子中,你也可以看到相当大的加速。

对于这种情况,我只需要几个积分,每个积分需要一个小时以上的时间,如果能够一次运行它们,并得到所有的答案,而不是一次运行一个,那将是一件非常好的事情。在我看来,类似于
并行表
或类似的工具对你来说很合适。如果它们没有像示例中那样被整数索引,您可以通过定义
h[n]:=Which[n==1,foo,n==2,foo…]
或使用类似的技巧并行计算表来实现这一点。或者您可以使用
Parallelize
手动将它们全部写入一个大的长列表中,如
Parallelize[{foo,foo,foo…}]