【问题标题】:parfor/for depending on loopsizeparfor/for 取决于循环大小
【发布时间】:2017-06-20 02:26:58
【问题描述】:

有没有一种简单的方法可以在 matlab 中编写一个 for 循环,使得低于一定次数 (n) 的迭代是一个正常的 for 循环,而高于这个阈值是一个 parfor 循环?

我想减少与创建并行池相关的开销。我尝试将工作人员的数量设置为 1(少于 n 次迭代),但开销仍然不可忽略。

【问题讨论】:

  • 为什么不能用if n > 100, parfor ... else, for... end 包围所有内容,或者只是提前启动池?
  • 我考虑过这些解决方案..但我觉得它们并不令人满意..
  • 您可能想澄清您对所需解决方案的期望,看看“琐碎的解决方案”(可能是唯一的解决方案)如何不够好......您是否考虑过其他一些部分你的算法可能比创建池更耗时?
  • 1.该程序应该很快(至少开销很小)独立于之前启动的 parpool。 2.代码应该易于维护和扩展,因此我不想要重复的代码段。我想到了类似 parfor 的预定义修饰符(例如 parpool(1) 但这仍然会导致开销..)

标签: matlab for-loop parallel-processing parfor


【解决方案1】:

选项 1:

加速 parpool 的启动(可能不适用于所有系统和/或 MATLAB 版本):

distcomp.feature( 'LocalUseMpiexec', false );

(Source)

选项 2:

parpool 设置一个非常长的超时时间,以便它在需要时肯定存在:

% This will set the idle timeout to 2 hours 
parpool('IdleTimeout', 120);
...
functionThatPossiblyCallsParfor();

% If pool is already running:
p = parpool;
p.IdleTimeout = 120;
...
functionThatPossiblyCallsParfor();

(Source)

选项 3:

if/else 基于所需的迭代次数(这回答了问题标题):

if n > 1E6 % or any other appropriate limit
  parfor (...)
    someFunction(slicedInput1,slicedInput2,...);
  end
else
  for (...)
    someFunction(input1,input2,...);
  end
end

【讨论】:

  • 是的!我没想过将循环端放入函数中。谢谢
  • 很高兴我能帮上忙 :)
猜你喜欢
  • 1970-01-01
  • 2014-06-10
  • 1970-01-01
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多