如何决定运行时是否在matlab中使用'for'或'parfor'循环以及为什么它们之间的差异很小?

时间:2013-03-22 20:47:54

标签: performance matlab parallel-processing lambda

我正在尝试在matlab中测试parforfor相比的效果,我构建了简单的function calculates π

enter image description here

这是parfor的函数:

function [calc_pi,epsilon] = calcPi(max)
format long;

in = 0;
tic
parfor k=1:max
    x = rand();
    y = rand();
    if sqrt(x^2 + y^2)<1
        in = in + 1;
    end
end

toc
calc_pi = 4*in/max; 
epsilon = abs(pi - calc_pi);
end

我用parfor运行它并获得此输出:

>> [calc,err] = calcPi(1000000000)
Elapsed time is 92.2923 seconds.

calc =

   3.141638468000000


err =

     4.581441020690136e-05

>> 

我带来了for循环:

>> [calc,err] = calcPi(1000000000)
Elapsed time is 121.3432 seconds.

calc =

   3.141645132000000


err =

     5.247841020672439e-05

我有两个问题:

  1. 为什么两者花费的时间相同? (与展示here
  2. 不同
  3. 我想在函数中添加一个参数来指示是否 用于或代表最小的代码更改:

    即。 :

    if (use_par):
        parfor k=1:10
    else
       for k=1:10
    end
    
    <--rest of code here-->
    

    如何用最少量的代码编写它?

1 个答案:

答案 0 :(得分:1)

parfor的主要要求是循环执行是独立的。这里显然不是每个迭代都可以更新变量in

好消息是,您可以使用in(k)来解决此问题。


使用一个循环或另一个循环而不使用额外代码的一种方法是将您执行的所有操作放在函数或脚本中,例如doeverything.m

然后写

if (use_par):
    parfor k=1:10
       doeverything
    end
else
   for k=1:10
       doeverything
   end
end