11

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

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

4

3 回答 3

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

您需要将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本身,并将您的开关设置在您的程序之上以并行或串行执行。

于 2015-08-18T13:18:28.390 回答
5

以及正常的语法

parfor i = 1:10

你也可以使用

parfor (i = 1:10, N)

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


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

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

完全获得循环for行为的唯一方法是使用多变的)。forforparforifelseforparfor

于 2014-08-11T12:58:38.320 回答
2

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

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

parpool(1)

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

于 2014-08-11T08:16:53.373 回答