MATLAB parfor慢于 - 出了什么问题?

MATLAB parfor慢于 - 出了什么问题?

我正在处理的代码有如下循环:

bistar = zeros(numdims,numcases); parfor hh=1:nt       
  bistar = bistar +  A(:,:,hh)*data(:,:,hh+1)' ;end

小nt(10)。

计时后,它实际上比使用常规循环慢100倍!我知道parfor可以做并行总和,所以我不确定为什么这不起作用。

我跑

matlabpool

在运行我的代码之前使用开箱即用的配置。

我对matlab比较陌生,刚开始使用并行功能,所以请不要认为我没有做一些愚蠢的事情。

谢谢!

PS:我在四核上运行代码,所以我希望看到一些改进。


繁星淼淼
浏览 1680回答 3
3回答

茅侃侃

对小的值进行分区和分组结果(分割工作和从多个线程/核心收集结果的开销)很高nt。这是正常的,您不会为可以在简单循环中快速执行的简单任务分区数据。始终在循环内执行一些具有挑战性的东西,这值得分区开销。这是对并行编程的一个很好的介绍。线程来自线程池,因此创建线程的开销不应该存在。但是为了创建部分结果必须创建大小的n矩阵,bistar计算所有部分结果,然后必须添加所有这些部分结果(重新组合)。在直接循环中,这很有可能就地完成,不进行分配。帮助中的完整声明(感谢您的链接):如果计算f,g和h的时间很长,则parfor将明显快于相应的for语句,即使n相对较小。所以你看他们的意思与我的意思完全相同,如果你在循环中做的事情足够复杂/耗时,那么小n值的开销只值得努力。

largeQ

除了由于通信开销导致的性能不佳(参见其他答案)之外,还有另一个原因是parfor在这种情况下不使用。parfor在这种情况下完成的所有内容都使用内置多线程。假设所有工作人员都在同一台PC上运行,那么没有任何优势,因为单个呼叫已经使用了处理器的所有核心。
打开App,查看更多内容
随时随地看视频慕课网APP