17

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

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

对于小 nt (10)。

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

我跑

matlabpool

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

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

谢谢!

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

4

3 回答 3

22

对于较小的nt. 这是正常的,您不会为可以在简单循环中快速执行的简单任务对数据进行分区。

总是在循环内执行一些值得分区开销的具有挑战性的事情。这是对并行编程的一个很好的介绍

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

帮助中的完整声明(感谢您在下面提供的链接)是:

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

因此,您会看到它们的含义与我的意思完全相同,仅当您在循环中执行的操作足够复杂/耗时时,小 n 值的开销才值得付出努力。

于 2010-07-04T10:22:47.967 回答
13

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

例如,如果 parfor 有 100 毫秒的开销,循环中的计算需要 5 毫秒,如果我们假设速度增益在 4 核系数为 1 的情况下是线性的(即使用 4 核使计算速度提高 4 倍) ,nt需要大约 30 才能实现速度增益parfor(150ms 和for,132ms 和parfor)。如果您只运行 10 次迭代,parfor将会更慢(使用 50 毫秒for,使用 112毫秒parfor)。

您可以通过比较执行时间与 1 个工作人员与 0 个工作人员来计算机器上的开销,并且您可以通过使用 1 到 4 个工作人员的执行时间来估算速度增益。然后你就会知道什么时候使用parfor.

于 2010-07-04T12:35:27.610 回答
3

除了由于通信开销而导致的性能不佳(请参阅其他答案),parfor在这种情况下还有另一个不使用的原因。在这种情况下所做的一切都parfor使用内置的多线程。假设所有工作人员都在同一台 PC 上运行,则没有任何优势,因为单个调用已经使用了处理器的所有内核。

于 2016-02-06T01:45:01.107 回答