【问题标题】:Can a Matlab PARFOR loop be programmatically switched on/off?可以通过编程方式打开/关闭 Matlab PARFOR 循环吗?
【发布时间】:2012-04-12 23:37:42
【问题描述】:

关于 MATLAB 中的 parfor 有一个简单的问题。我想在我的程序中设置一个标志,以在 parfor 和常规 for 循环之间进行切换。基本上,我需要这个功能,以便我的代码的某些部分可以在“调试”模式下更新图形,然后当标志关闭时,使用 parfor 而不进行图形更新以提高速度。

所以,我正在寻找具有此功能的简单产品:

if (flag)
  for i = 1:n
else
  parfor i = 1:n
end

  % Do loop tasks.

  end

任何帮助将不胜感激!谢谢!

【问题讨论】:

  • 保留大小为 1 的池是否可以解决您的问题?
  • 不完全是因为 parfor 限制创建任何图形对象,例如绘图。因此,每当我想要这个输出时,我都必须手动编辑函数的代码。

标签: matlab parfor


【解决方案1】:

不,这是不可能的。但是,如果您可以将循环体包装在一个单独的函数中,则可以让 parforfor 循环调用循环体,即

if (flag)
   parfor i=1:n
      out(i) = loopBody(i)
   end
else
   for i=1:n
      out(i) = loopBody(i)
   end
end

或者,您可以编辑代码,以便在循环前面有parforfor,这是我经常做的事情。

【讨论】:

  • 如果是 4 月 1 日,我会发表这样的评论:“我希望 MATLAB 有 #defines!那么我们可以使用 #define LOOP parfor#define LOOP for,这样我们就不会遇到这个问题了!”跨度>
  • @Li-aungYip:是的,这确实很方便。 parfor 很讨厌调试。不过,我希望在 R2015a 左右,问题得到解决。
【解决方案2】:

另一个选项 - 使用 PARFOR 的可选参数

if flag
  arg = Inf;
else
  arg = 0;
end
parfor (idx = 1:n, arg)
   ...
end

【讨论】:

    【解决方案3】:

    当您通过matlabpool close 关闭池时,parfor 的行为就像for 并允许所有图形处理。所以你只需要在调试时关闭池。

    【讨论】:

    • parfor 的行为与 for 不同,即使没有工人池也是如此。不保证循环迭代的顺序,它们可以按任何顺序执行。通常,只是为了确保您不依赖它们处于正常顺序,它们实际上以 reverse 顺序执行。
    • 请注意,这不再完全正确 - MATLAB 和 PCT 的最新版本 会自动为您打开一个池,因此您可能需要使用可选的工作人员数量参数根据我的回答,parfor
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多