【问题标题】:MATLAB parfor is slower than for -- what is wrong?MATLAB parfor 比 for 慢——出了什么问题?
【发布时间】:2010-07-04 10:17:00
【问题描述】:

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

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

对于小 nt (10)。

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

我跑

matlabpool

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

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

谢谢!

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

【问题讨论】:

  • 你能告诉我们numdims、numcases的值和你找到的实际时间数字吗?谢谢。

标签: performance matlab parallel-processing parfor


【解决方案1】:

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

始终在循环内执行一些值得分区开销的具有挑战性的事情。这是一个不错的introduction to parallel programming

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

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

如果计算 f、g 和 h 的时间为 大,parfor会显着 比相应的更快 陈述,即使 n 是相对的 小。

所以你看到它们的意思和我的意思完全一样,只有当你在循环中所做的事情足够复杂/耗时时,小 n 值的开销才值得付出努力。

【讨论】:

  • 感谢您的回复,但是在mathworks.com/access/helpdesk/help/toolbox/distcomp/parfor.html 中它指出“parfor 将明显快于相应的 for 语句,即使 n 相对较小。” (当然 idk 相对较小的意思是什么。)我很困惑,你所说的划分工作和从几个线程/核心收集结果的开销是什么意思?变量 A 和数据是全局的,应该已经在所有线程之间共享。所有 matlab 所要做的就是小心添加到 bistar。
  • 我添加了一个精确度,感谢链接我查看了帮助,它与我试图弄清楚的内容相同。我不太擅长解释事情 :-) 句子的“如果”部分非常重要。希望能帮助到你!这不仅适用于 matlab,而且适用于各种并行计算。充分划分问题至关重要。
  • +1 指出阅读所有帮助的必要性,而不是只阅读您想要的部分。
  • 再次感谢 jdehaan :) 有趣的是,我认为 MATLAB 实际上创建了 4 个进程,我猜它正在将工作外包给这些进程,所以你所说的开销是可以感受到的(因为没有共享内存进程之间)。然而,在一个完美的世界中,工作将外包给共享变量 A、数据和 bistar 的线程,因此分区将是传递索引的问题(可忽略的开销),并且由于 bistar 是共享的,因此重新组合只是添加到并行正确索引(可忽略不计的开销)。这不是更快吗?我错过了什么吗?
  • @Donnie 我不是故意忽略的,我工作累了,真的要睡觉了……
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2017-01-27
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 2020-11-27
      • 1970-01-01
      • 2018-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多