为什么parfor-loop花费的时间比for-loop多?

时间:2014-04-16 07:49:43

标签: matlab parallel-processing matlabpool

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-loop比单个for-loop花费的时间要多得多。此外,我的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

1 个答案:

答案 0 :(得分:1)

请参阅此page

  

并行开销。调用parfor而不是for的开销很大。如果功能评估很快,这种开销可能会变得明显。特别是,并行解决问题可能比连续解决问题要慢。

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

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