【问题标题】:Why parfor-loop spend more time than for-loop? [duplicate]为什么 parfor-loop 比 for-loop 花费更多时间? [复制]
【发布时间】:2014-05-30 22:57:21
【问题描述】:
function test_parfor
N = 1e8;
sum_all = 0; % sum all numbers
sum_odd = 0; % sum odd numbers
sum_even = 0; % sum even numbers
tic;
parfor i = 1 : N
  sum_all = sum_all + i; % sum all numbers
  if mod(i,2)
      sum_odd = sum_odd + i; % sum odd numbers
  else
      sum_even = sum_even + i; % sum even numbers
  end %endif
end %endfor
toc;
fprintf('sum_all=%d,\nsum_odd=%d,\nsum_even=%d.\n', ...
    sum_all, sum_odd, sum_even);

我已经初始化了 parpool 环境并运行了上面的代码。但是,parfor 循环比单个 for 循环花费的时间要多得多。此外,我的 PC 的 numCores 是 12,我在运行功能代码之前已经初始化了 12 个工作器。 为什么?我的代码有什么问题?

非常感谢! :-)

另外,并行计算环境的初始化代码如下。

function initpar(CoreNum)
%Initialize Matlab Parallel Computing Enviornment

if nargin==0
    CoreNum=feature('numCores');
end
if  isempty(gcp('nocreate'))
    clear ALL;
    parpool('local',CoreNum); % matlabpool in R2013
else
    disp('Parallel Computing Enviornment already initialized');
end

【问题讨论】:

  • 并行计算有“开销”。您是否尝试过使用更多迭代来运行循环,从而使潜在收益超过了这种开销?

标签: matlab parallel-processing matlabpool


【解决方案1】:

看到这个page

并行开销。调用 parfor 而不是 for 会产生开销。如果函数评估速度很快,那么这种开销可能会变得可观。尤其是并行解决问题可能比串行解决问题要慢。

提示是每次迭代不耗时时不要使用parfor;处理成本的限制当然取决于您的硬件。

编辑:如果你删除 if-else 块,循环的行为会改变。 sum_all 现在被检测为减少变量,正如 page 中所解释的那样。然后将循环正确地分解为独立的部分;最后合并部分结果。使用 if-else 块,sum_evensum_odd 不被视为归约变量(我认为),因此它的行为类似于经典的 for 循环加上并行计算开销。

【讨论】:

  • 感谢您的回复和文档参考。
  • 当我删除 parfor 循环中的 If-else 块并仅保留“sum_all = sum_all + i”时,parfor 循环比 for 循环花费的时间少得多。你能解释一下为什么吗?
  • @chentaocuc 查看我的编辑。更多信息,请仔细阅读 Matlab 文档中并行计算文档的所有相关页面。
  • 非常感谢您的大力帮助!最美好的祝愿!
猜你喜欢
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
  • 2014-03-01
  • 1970-01-01
  • 2019-07-06
  • 1970-01-01
相关资源
最近更新 更多