主要内容

利用消息传递的圆周率数值估计

这个示例展示了使用spmd语句的基础知识,以及它们如何提供执行并行计算的交互式方法。我们通过相对简单的计算来近似圆周率。

这个例子中显示的代码可以在这个函数中找到:

函数paralleldemo_quadpi_mpi

简介

我们打算利用这个事实

$ $ \ int_0 ^ 1 {4 \ / {1 + x ^ 2}} dx = 4(:(1) -(0)每股)=π\ $ $

通过近似左边的积分来近似。

我们打算让并行池并行地执行计算,并使用spmd关键字来标记并行代码块。我们首先看一下当前开放的并行池的大小。

P = gcp;p.NumWorkers
使用'Processes'配置文件启动并行池(parpool)…连接到并行池(worker数:6),ans = 6

并行计算

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

类型pctdemo_aux_quadpi.m
function y = pctdemo_aux_quadpi(x) % pctdemo_aux_quadpi返回近似pi的数据。用于近似圆周率的辅助函数。这是4*atan(x)的导数%y = 4. The MathWorks, Inc.版权所有/(1 + x.^2);

如图所示,我们通过让每个工人计算函数在[0,1]子区间上的积分来将工作分配给工人。

我们定义变量一个而且b对一切劳动者,但要让他们的价值观依赖spmdIndex因此,区间[a, b]对应于图中所示的子区间。然后我们验证间隔是否正确。请注意,spmd语句主体中的代码是在并行池中的所有worker上并行执行的。

spmda = (spmdIndex - 1)/spmdSize;b = spmdIndex/spmdSize;流('子区间:[%-4g, %-4g]\n', a, b);结束

我们现在让所有的工作人员使用MATLAB求积分的方法来近似每个积分。它们都作用于同一个函数,但作用于上图中[0,1]的不同子区间。

spmdmyIntegral = integral(@pctdemo_aux_quadpi, a, b);流('子区间:[%-4g, %-4g]积分:%4g\n'...a, b, myIntegral);结束

添加结果

工作人员都计算了函数积分中各自的部分,我们将结果相加,形成[0,1]上的整个积分。我们使用spmdPlus添加函数myIntegral对所有的工人,然后返回所有工人的和。

spmdpiApprox = spmdPlus(myIntegral);结束

在客户端中检查结果

因为变量piApprox在spmd语句中被赋值,它可以作为一个Composite在客户端上访问。复合对象类似于单元格数组,每个worker有一个元素。对Composite进行索引将相应的值从worker返回到客户机。

approx1 = piApprox{1};第一个元素保存工人1的值。流(' π: %.18f\n'π);流(“近似:% .18f \ n”, approx1);流(错误:%g\n, abs(pi - approx1))
pi: 3.141592653589793116近似值:3.141592653589793116误差:0

另请参阅

|

相关的话题