0

我正在尝试测试与matlabparfor相比的效果,我构建了简单的函数来计算 πfor

在此处输入图像描述

这是具有以下功能的功能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. 为什么两者都需要大约相同的时间?(与此处显示的不同)
  2. 我想在函数中添加一个参数,指示是使用 for 还是 parfor ,而代码的变化最小:

    IE :

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

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

4

1 回答 1

1

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

好消息是你可以通过使用来解决这个问题in(k)


例如,在不使用额外代码的情况下使用一个循环或另一个循环的一种方法是将您所做的所有事情放在一个函数或脚本中doeverything.m

然后写

if (use_par):
    parfor k=1:10
       doeverything
    end
else
   for k=1:10
       doeverything
   end
end
于 2013-03-22T21:16:07.517 回答