防止MATLAB打开池

use*_*923 11 parallel-processing matlab parfor

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

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

Adr*_*aan 7

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

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

更新结果确实可以通过代码更改设置,虽然我不建议这样做,因为它涉及更改MATLAB的首选项文件.这取自Yair Altman 的未记载的MATLAB博客.

ps = parallel.Settings;
ps.Pool
ans = 
  PoolSettings with properties:
                            AutoCreate: 1
                RestartOnClusterChange: 1
    RestartOnPreferredNumWorkersChange: 1
                           IdleTimeout: 30
                   PreferredNumWorkers: 12
Run Code Online (Sandbox Code Playgroud)

您需要将AutoCreate开关更改为的位置0.

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

parfor 1:N
    output = function(..)
end
Run Code Online (Sandbox Code Playgroud)

现在修改您的脚本/功能以Parallel在顶部切换:

if Parallel
    parfor 1:N
        output = function(..)
    end
else
    for 1:N
        output = function(..)
    end
end
Run Code Online (Sandbox Code Playgroud)

您可以编辑和调试function自身,并将您的开关设置在程序之上,以并行或串行方式执行.


Sam*_*rts 5

以及正常的语法

parfor i = 1:10
Run Code Online (Sandbox Code Playgroud)

你也可以用

parfor (i = 1:10, N)
Run Code Online (Sandbox Code Playgroud)

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


编辑:要清楚,这仅控制执行代码的工作者数量(如果N为零,则是否完全启动池).如果不存在池,则代码将在客户端上执行.尽管如此,代码仍然是一个parfor循环,它与循环没有相同的语义for- 对parfor循环不存在的for循环的循环代码有限制,并且不能保证循环迭代的执行顺序.

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

完全获取for循环行为的唯一方法是使用for,如果需要来回切换以进行调试,则需要对for/ 进行注释和取消注释parfor(或者使用if/ elseblock,在a for和a 之间切换,parfor具体取决于某些变量).