利用消息传递的圆周率数值估计
这个示例展示了使用spmd语句的基础知识,以及它们如何提供执行并行计算的交互式方法。我们通过相对简单的计算来近似圆周率。
这个例子中显示的代码可以在这个函数中找到:
函数paralleldemo_quadpi_mpi
简介
我们打算利用这个事实
通过近似左边的积分来近似。
我们打算让并行池并行地执行计算,并使用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