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值的开销只值得努力.
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
.