文档

使用消息传递的数值估计π

这个例子展示了使用spmd语句的基本知识,以及如何提供一个交互式方法进行并行计算。我们通过执行相对简单的计算近似π。

相关文档:

相关例子:

这个示例中所示的代码可以在这个函数:

函数paralleldemo_quadpi_mpi

介绍

我们打算使用这一事实

通过近似积分近似π在左边。

我们打算有平行池并行执行计算,并使用spmd关键字并行的代码块。我们首先看看当前打开的平行的池的大小。

p =质量;p.NumWorkers
ans = 12

并行化计算

我们的数值积分近似π4 / (1 + x ^ 2)从0到1。

类型pctdemo_aux_quadpi.m
函数y = pctdemo_aux_quadpi (x) % pctdemo_aux_quadpi返回数据近似π。%用于近似πHelper函数。这是导数% 4 * (x)每股。% 2008年版权MathWorks公司y = 4。/ (1 + x ^ 2);

我们工人之间的分工(实验室),每个工人计算函数的积分的子区间[0,1],如图片所示。

我们定义的变量一个b在所有的工人,但是让它们的值取决于labindex这样间隔子区间[a, b]对应于图所示。然后我们确认间隔是正确的。注意,代码spmd语句是并行执行的主体平行池中所有的工人。

spmd= (labindex - 1) / numlabs;b = labindex / numlabs;流(“子区间:[% 4 g, % 4 g] \ n”,a, b);结束
实验室1:子区间[0,0.0833333):实验室2:小音程:[0.0833333,0.166667]实验室3:子区间:[0.166667,0.25]实验室4:子区间:[0.25,0.333333]实验室5:子区间:[0.333333,0.416667]实验室6:子区间:[0.416667,0.5]实验室7:子区间:[0.5,0.583333]实验室8:子区间:[0.583333,0.666667]实验室9:子区间:[0.666667,0.75]实验室10:子区间:[0.75,0.833333]实验室11:子区间:[0.833333,0.916667]实验室12:子区间:[0.916667,1]

现在我们让所有的工人使用MATLAB正交方法近似积分。他们都使用相同的功能,但在不同的个子区间[0,1]的上图所示。

spmdmyIntegral =积分(@pctdemo_aux_quadpi, a, b);流(“子区间:[% 4 g, % 4 g]积分:% 4 g \ n ',a、b myIntegral);结束
实验1:子区间:[0,0.0833333]积分:0.332565实验室2:小音程:[0.0833333,0.166667]积分:0.32803实验室3:子区间:[0.166667,0.25]积分:0.31932实验室4:子区间:[0.25,0.333333]积分:0.307088实验室5:子区间:[0.333333,0.416667]积分:0.292162实验室6:子区间:[0.416667,0.5]积分:0.275426实验室7:子区间:[0.5,0.583333]积分:0.257707实验室8:子区间:[0.583333,0.666667]积分:0.239713实验室9:子区间:[0.666667,0.75]积分:0.221994实验室10:子区间:[0.75,0.833333]积分:0.204949实验室11:子区间:[0.833333,0.916667]积分:0.188836实验室12:子区间:[0.916667,1]积分:0.173804

添加结果

工人们都计算部分的积分函数,我们加在一起形成整个积分结果[0,1]。我们使用gplus函数来添加myIntegral在所有的工人和返回所有的工人的总和。

spmdpiApprox = gplus (myIntegral)公关;结束

在客户端检查结果

由于变量piApprox被分配到一个spmd语句,它可以在客户端作为一个组合。复合对象类似于细胞数组和一个元素为每个工人。索引到复合带回从工人到客户端相应的价值。

approx1 = piApprox {1};% 1的元素值对工人1。流(“π:% .18f \ n”π);流(“近似:% .18f \ n”,approx1);流(“错误:% g \ n”、abs(π- approx1))
pi: 3.141592653589793100近似:3.141592653589792700错误:4.44089 e-16
这个主题有帮助吗?