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

Jun*_*ier 17 parallel-processing performance matlab parfor

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

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

小nt(10).

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

我跑

matlabpool
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!

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

jde*_*aan 22

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

始终在循环内执行一些具有挑战性的东西,这值得分区开销.这是对并行编程的一个很好的介绍.

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

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

如果计算f,g和h的时间很长,则parfor将明显快于相应的for语句,即使n相对较小.

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

  • +1表示阅读所有帮助的必要性,而不仅仅是看起来像你想要的部分. (4认同)

Jon*_*nas 13

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

例如,如果parfor带有100ms的开销,并且循环中的计算需要5ms,并且如果我们假设速度增益是线性的,最多4个核,系数为1(即使用4个核使计算速度快4倍) ,nt需要大约30来实现速度增益parfor(150ms for,132ms parfor).如果你只运行10次迭代,parfor则会更慢(50ms for,112ms parfor).

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