复化梯形公式matlab程序_【HPC】高性能数值计算-梯形面积法

本文介绍了如何使用MATLAB实现复化梯形公式,并通过MPI进行并行计算优化。内容包括梯形积分法的串行代码、并行任务划分、MPI的集合通信(如MPI_Reduce和MPI_Bcast)在计算中的应用,以及性能评估方法。实验结果表明,数据规模N的增加并不总是直接导致运行时间的线性增长,而通信进程数Comm_sz的增加在大问题规模下能显著提升性能。此外,不同被积函数对程序性能有一定影响。
摘要由CSDN通过智能技术生成

ec106bb938b7209698429f2cdd27cd5d.png

原理

c881aa8b51f5c47907b4d69eaf5b99d4.png

将 x 轴上的区间划分为 n 个等长的子区间,有

,
,
,......,

梯形面积可表示为

首先很容易可以得出串行计算的代码:

/*Input a, b, n*/
h = (b - a)/n;
approx = (f(a) + f(b))/2.0;
for(i = 1;i <= n-1; i++) {
    x_i = a + i * h;
    approx += f(x_i);
}
approx = h * approx;

现在考虑并行化梯形积分法

在划分阶段,通常尝试识别成尽可能多的任务,对于梯形积分法,我们可以识别出两种任务

  1. 获取单个矩形面积的任务

使用的梯度 N 越多,估计值就越精确。当梯形的数目将超过核的数量,需要将梯度区域面积的计算聚合成组。为了实现这一目标一个很自然的地方是将区间[a,b]划分成 comm_sz 个子区间。

 width = (b - a)/(double)N;

/* how many trapezoids per process? */
local_n = N/nprocs;

/* calculate local interals to work on */
local_a = a + (rank * (local_n * width));
local_b = local_a + (local_n * width);

2. 计算这些区域的面积和

/* message passing and totalling of local sums */
if (rank == MASTER) {
  integral = local_sum;
  for (source =1; source < nprocs; source++) {
    MPI_Recv(&local_sum, 1, MPI_DOUBLE, source, tag, MPI_COMM_WORLD, &status);
    integral += local_sum;
  }
}
else {
  MPI_Send(&local_sum, 1, MPI_DOUBLE, dest, tag, MPI_COMM_WORLD);
}

集合通信

  • 在MPI里,涉及通信子中所有进程的通信函数称为集合通信(collective communication)
  • MPI_Reduce(归约):函数将通信器内每个进程输入缓冲区( sendbuf )中的数据按给定的操作进行简单运算,并将其结果返回到根进程的输出缓冲区( recvbuf )中
  • MPI_Bcast(广播):属于一个进程的数据被发送到通信子中的所有进程

88b99906091fd2f5a769fdecd349fe8f.png
示意图

任务描述

结合课程所学基础知识,利用 MPI 进行并行计算。使用不同被积函数实现梯形面积法求解 pi的近似值。通过修改数据规模 N 和通信进程数 Comm_sz 来进行算法的性能评估以及考察与 pi 真实值之间的误差变化。

性能评估

1. 使用计时函数对程序性能进行评估,根据并行时间取决于“最慢”进程花费的时间,设计计时函数。使用 MPI_Barrier() 能够确保同一个通信子中的所有进程都完成调用该函数之前,没有进程能够提前返回。从而确保所返回时间能准确描述程序并行时间。

7552521a427b9fe557d83a919d6aa657.png
计时代码

2. 由于计时存在易变性,尽管每次输入的参数一样,进程数相同,运行环境也没有发生改变,但多次运行同一段程序,仍然可能会见到运行时间有变化。因为系统其余部分,尤其是操作系统的影响,是不可预知的。于是此处报告的是最短运行时间,而不是平均运行时间或者中位数时间。

实验结果

d8783b38214da0610a8a0826bc5b258d.png
运行截图

公式 1 :

851c5fbe7f5949c216a9dc96fae6ab5b.png
PI的串行和并行程序的运行时间(单位: 毫秒)

公式 2 :

56fd896d70ffd6b37d4914dee2087c16.png
PI的串行和并行程序的运行时间(单位:毫秒)

实验分析

1. 数据规模 N 的影响:

程序中 local_n = N/nprocs ,代表含义为积分区间均等划分的数量。由上述实验结果显示,数据规模的增大与程序运行时间并无明显线性相关性。这是由于数据规模在一定范围内受限于运行环境等因素,导致运行时间的不确定。当 N 增大到一定规模时,程序的运行时间也显著增大。

2. 通信进程数 Comm_sz 的影响:

当数据规模小时,增大进程数并未如预期显著提升程序性能。对于大的问题规模而言,增大进程数对应性能提升有很大帮助,大幅减少了运行时间。

3. 被积函数的影响:

公式 1 整体性能优于公式 2,分析可能原因是程序在处理三角函数时需花费较多时间,对整体性能产生了影响。

附件-代码:

Ubuntu Pastebin​paste.ubuntu.com
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值