代码之家  ›  专栏  ›  技术社区  ›  Junier

MATLAB parfor比for慢-怎么了?

  •  17
  • Junier  · 技术社区  · 14 年前

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

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

    在计时之后,它实际上是 而不是使用常规循环!!!我知道parfor可以做并行求和,所以我不知道为什么这不起作用。

    matlabpool
    

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

    我对matlab比较陌生,刚刚开始使用并行特性,所以请不要以为我没有做什么蠢事。

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

    3 回复  |  直到 9 年前
        1
  •  22
  •   jdehaan    14 年前

    对于较小的 nt

    总是在循环中执行一些具有挑战性的操作,这些操作值得分区开销。这是一个不错的 introduction to parallel programming .

    线程来自线程池,因此创建线程的开销不应存在。但为了创造部分结果 n bistar 必须创建大小,计算所有部分结果,然后添加所有这些部分结果(重新组合)。在一个直循环中,这是一个很高的概率完成到位,没有分配发生。

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

    大的 比对应的 语句,即使n相对 小的。

        2
  •  13
  •   Jonas    14 年前

    Parfor nt 是非常小的,如果循环中的计算非常快(像加法),则 parfor 解决方案比较慢。此外,如果你跑 帕弗 在四核上,1-3核的速度增益将接近线性,但如果使用4核,速度增益将更小,因为最后一个核还需要运行系统进程。

    例如,如果parfor有100ms的开销,循环中的计算需要5ms,如果我们假设速度增益是线性的,最多4个核的系数为1(即使用4个核使计算速度加快4倍), 需要大约30岁,你才能获得速度增益 (150ms,带 for ,132ms,带 帕弗 帕弗 会更慢(50毫秒) 对于 帕弗 ).

    您可以通过比较1个工人的执行时间与0个工人的执行时间来计算机器上的开销,还可以通过对1到4个工人的执行时间进行线性拟合来估计速度增益。这样你就知道什么时候用它有用了 帕弗

        3
  •  3
  •   Daniel    9 年前

    除了由于通信开销(参见其他答案)导致的性能不佳之外,还有另一个不使用的原因 parfor 在这种情况下。在这个世界上所做的一切 帕弗 在这种情况下使用 built-in multithreading . 假设所有worker都在同一台PC上运行,这没有什么好处,因为单个调用已经使用了处理器的所有内核。