防止MATLAB打开池

时间:2014-08-11 08:13:05

标签: matlab parallel-processing parfor

当我安装并行计算工具箱并在我的代码中使用parfor时,MATLAB会在到达parfor循环后自动启动池。然而,这有时难以调试,这就是为什么我想阻止MATLAB在某些情况下打开池。那么,我怎么能告诉MATLAB不要打开池?显然,我可以浏览我的代码并删除所有parfor循环,并用普通的for循环替换它们,但这很乏味,我可能会忘记撤消我的更改。

编辑要指定,我理想地希望parfor循环在设置控件或变量或其他东西时的行为与for完全相同。也就是说,我应该能够在for循环中放置断点。

3 个答案:

答案 0 :(得分:7)

在Home-> parallel-> parallel偏好设置下,您可以取消选中复选框"当执行并行关键字时,自动创建并行池(如果一个并不存在)。"这使得所有parfor循环都表现为普通for循环。

如果我在代码中找到一种方法,而不是使用复选框,我会回复你。

更新结果确实可以通过代码更改设置,但我不建议这样做,因为它涉及更改MATLAB的首选项文件。这取自Yair Altman的Undocumented MATLAB blog

ps = parallel.Settings;
ps.Pool
ans = 
  PoolSettings with properties:
                            AutoCreate: 1
                RestartOnClusterChange: 1
    RestartOnPreferredNumWorkersChange: 1
                           IdleTimeout: 30
                   PreferredNumWorkers: 12

您需要将AutoCreate切换为0

作为替代方案,我建议将parfor中的所有内容包装在函数中,从而调用

parfor 1:N
    output = function(..)
end

现在修改您的脚本/功能,使Parallel开关位于顶部:

if Parallel
    parfor 1:N
        output = function(..)
    end
else
    for 1:N
        output = function(..)
    end
end

您可以编辑和调试function本身,并将您的开关设置在程序之上,以便并行或串行执行。

答案 1 :(得分:5)

以及正常的语法

parfor i = 1:10

您也可以使用

parfor (i = 1:10, N)

其中N是循环中使用的最大worker数。 N可以是代码其他部分设置的变量,因此您可以通过将变量N设置为1或0来有效地打开和关闭并行性。


编辑:要清楚,这只能控制执行代码的工作者数量(如果N为零,则表示池是否完全启动)。如果不存在池,则代码将在客户端上执行。然而,代码仍然是parfor循环,具有与for循环相同的语义 - parfor循环的循环代码存在限制for循环不存在,并且无法保证循环迭代的执行顺序。

当您使用parfor时,您所做的不仅仅是说"请加快速度"。您对MATLAB"我可以向您保证,此循环的迭代是独立的,并且可以按任何顺序执行,因此如果您尝试将其并行化,那么您就可以了。因为您已经保证,MATLAB能够通过使用与for循环不同的语义来加快速度。

完全获得for循环行为的唯一方法是使用for,如果您需要来回切换以进行调试,则需要对{{进行评论和取消注释1}} / for(或者使用parfor / if块,根据某个变量在elsefor之间切换。

答案 2 :(得分:2)

我认为去这里的方法不是禁用parfor,而是让它表现得像一个简单的for

这应该可以通过将工人数量设置为1来实现。

parpool(1)

根据您的代码,您可以在运行代码之前执行此操作一次,或者每次在代码中的任何位置设置工作器数时,您可能需要(有条件地)执行此操作。