我要处理的代码具有以下循环:

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

对于小NT(10)。

计时后,实际上是 慢100倍 而不是使用常规循环!!!我知道Parfor可以进行并行总和,因此我不确定为什么这不起作用。

我跑了

matlabpool

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

我对MATLAB相对较新,并且刚刚开始使用并行功能,所以请不要以为我不是在做愚蠢的事情。

谢谢!

PS:我正在Quad Core上运行代码,因此我希望看到一些改进。

有帮助吗?

解决方案

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

始终在循环中执行一些具有挑战性的东西,值得分区开销。这是一个不错的 平行编程简介.

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

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

如果时间计算F,G和H很大, ,即使n相对较小,PARFOR的速度也将比对应的语句相对应快得多。

因此,您会发现它们的意思与我的意思完全相同,只有在循环中所做的工作很复杂/耗时时,小n值的开销才值得付出努力。

其他提示

Parfor带有一些开销。因此,如果 nt 真的很小,如果循环中的计算很快完成(例如加法), parfor 解决方案较慢。此外,如果您跑步 parfor在四核上,速度增益将接近1-3个内核的线性,但是如果您使用4个内核,则更少,因为最后一个核心也需要运行系统进程。

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

您可以通过将执行时间与1名工人VS 0工人进行比较来计算机器上的开销,并且可以通过用1到4名工人在执行时间中拟合衬套来估计速度增长。然后您会知道何时使用 parfor.

除了由于沟通开销而表现不佳(请参阅其他答案),还有另一个原因不使用 parfor 在这种情况下。在内部完成的一切 parfor 在这种情况下使用 内置的多线程. 。假设所有工人都在同一PC上运行,则没有优势,因为单个调用已经使用了处理器的所有内核。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top