2011-08-03 60 views
5

我有很多数百个单元格长的Mathematica文件,我想使用并行评估。我有一个2处理器×4核心每台机器16 Gb内存。我的Mathematica许可证允许我最多运行2个主内核,其中1个主内核可以有4个从内核(这是我用它玩了一段时间后的解释)。在Mathematica中并行评估单元格

我曾经在两个不同的笔记本中的两个主内核中运行我的代码。为了进一步加快速度,我试图用ParallelEvaluate[]封装几个单元,它似乎工作。然后我还有4个副本,通过其中一个主内核运行,彼此不知道,这很好。 (我基本上试图尽可能多地并行运行我的代码/ mathkernel的副本,但我没有拍摄任何真正平行的东西)。

由于我的代码太长和复杂,我不想再次编辑每个单元格以使它们并行评估。在我的笔记本的开头有什么神奇的东西可以放入,所以每个单元格之后的评估将默认为ParallelEvaluate[ ... cell contents.... ]

+1

您真的确定要'ParallelEvaluate []'你所有的细胞?你已经在你的代码上做过实验了吗?提示:你可能会得到列表,你现在得到一个单一的结果... –

+0

是的,我得到表的列表,这是确定的。我将在主内核中手动合并这些表并分析结果。我只是想找出最简单的方法来使用所有的mathkernel来加速计算。 – Hsn

+0

我试图用$ Pre = ParallelEvaluate进行实验,但是现在我不能使用Mma(HW问题),或许您想试试它 –

回答

2

正如belisarius所建议的,$ Pre = ParallelEvaluate完全符合我的要求。一个问题是当我做$ Pre = Identity来关闭它以便我可以回到我的主内核时,mathematica仍然试图在从内核而不是主内核中进行评估并且失败。我最终解决它如下:SetSharedVariable [parallelcontrol]; parallelcontrol = ParallelEvaluate; $ Pre:= parallelcontrol; ......一切都是在这里的奴隶中被评估的......; parallelcontrol =身份; ....一切回到上主进行评估只......这里是一个有2个内核上我的笔记本电脑运行示例:

LaunchKernels[] 

{KernelObject [1,“本地”],KernelObject [2, “本地”]}

$KernelID 
ParallelEvaluate[$KernelID] 

{1,2}

SetSharedVariable[parcontrol]; $Pre := parcontrol; parcontrol = ParallelEvaluate 

空[ParallelEvaluate]

$KernelID 

{1,2}

parcontrol = Identity 

{身份,身份}

$KernelID 
parcontrol = ParallelEvaluate 

ParallelEvaluate

$KernelID 

{1,2}