我在拥有44名工作人员的计算机上运行此代码。但是,并行的每次迭代都比串行模式慢,尽管整个循环的总执行时间会减少。
template=cell(31,1);
for i=1:31
template{i}=rand(i+24);
end
parfor i=1:5
img=rand(800,1280+i); % It's an other function that gives me the values of img ,here it's just an example
tic
cellfun (@(t) normxcorr2 ( t ,img),template,'UniformOutput',0);
toc
end
因此,每个循环中的经过时间约为18秒。当我将parfor
更改为for
时,每个循环中经过的时间大约为6.7秒。
你能解释一下为什么在这种情况下parfor循环比for循环慢吗? 我检查了MATLAB文档以及类似的问题,但它对我没有帮助。
注意:parfor
版本执行脚本的总时间更快,我只是想了解为什么函数cellfun
在并行版本中慢了3倍。
答案 0 :(得分:2)
检查CPU使用情况。
我认为这里的主要原因是像fft这样的东西(最有可能是xcorr的一部分)已经使用了多个核心。我现在无法测试parfor,但普通for循环已经在我的4C / 4T CPU上使用你的代码有大约70%的CPU利用率。因此,parfor最多可以填充剩下的30%(在我的计算机上),但显然会慢慢运行每个实例。