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

时间:2010-07-04 10:17:00

标签: performance matlab parallel-processing parfor

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

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

小nt(10)。

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

我跑

matlabpool

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

我对matlab比较陌生,刚开始使用并行功能,所以请不要以为我不是在做傻事。

谢谢!

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

3 个答案:

答案 0 :(得分:22)

对于nt的小值,对结果进行分区和分组(分割工作和从多个线程/核心收集结果的开销)很高。这是正常的,您不会将数据分区以便于在简单循环中快速执行的简单任务。

始终在循环内执行一些值得分区开销的挑战。这是一个很好的introduction to parallel programming

线程来自线程池,因此创建线程的开销不应该存在。但是,为了创建部分结果n必须创建bistar大小的矩阵,计算所有部分结果,然后必须添加所有这些部分结果(重新组合)。在直接循环中,这很有可能就地完成,不会发生任何分配。

帮助中的完整声明(感谢您的链接):

  

如果计算f,g和h的时间是   大,,parfor将是显着的   比相应的更快   声明,即使n是相对的   小。

所以你看他们的意思与我的意思完全相同,如果你在循环中做的事情足够复杂/耗时,那么小n值的开销只值得努力。

答案 1 :(得分:13)

Parfor带来一些开销。因此,如果nt非常小,并且循环中的计算非常快(如添加),则parfor解决方案较慢。此外,如果在四核上运行parfor,则1-3个内核的速度增益将接近线性,但如果使用4个内核,速度增益将更少,因为最后一个内核也需要运行系统进程。

例如,如果parfor带有100ms的开销,并且循环中的计算需要5ms,并且如果我们假设速度增益是线性的,最多4个核,系数为1(即使用4个核进行计算4时间更快),nt需要大约30才能通过parforfor为150毫秒,parfor为132毫秒)获得速度提升。如果您只运行10次迭代,parfor会更慢(for为50ms,parfor为112ms。

您可以通过将执行时间与1名工人与0名工人进行比较来计算机器的开销,并且可以通过在1到4名工人的执行时间内使用衬管来估算速度增益。然后,您将知道何时使用parfor

答案 2 :(得分:3)

除了由于通信开销导致的性能不佳(参见其他答案)之外,还有另一个原因是在这种情况下不使用parfor。在这种情况下,parfor内完成的所有内容都使用built-in multithreading。假设所有工作人员都在同一台PC上运行,那么没有任何优势,因为单个呼叫已经使用了处理器的所有内核。

相关问题