MPI梯形积分法的算法实现(C语言)

2023-10-07 04:30

本文主要是介绍MPI梯形积分法的算法实现(C语言),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 一、实验代码
  • 二、实验运行效果
  • 三、问题以及思考
  • 总结


前言

要求:将课本上分散的MPI梯形积分法的算法实现为完整的MPI程序,并在分布式环境下编译、排错、调试、运行、优化。然后总结学习心得,撰写实验报告。
提示:MPI程序启动时,程序可执行文件会在每个节点启动运行,因此程序中所有的变量都是本地的私有变量;进程之间进行通信时,必须收发一一对应,有发无收和有收无发都会导致程序卡死。


一、实验代码

代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <mpi.h> 
double Trap(double left_endpt, double right_endpt, double trap_count, double base_len);
double f(double x);
void Get_data(int my_rank,int comm_sz,double* a,double* b,int* n);
int main(void)
{int my_rank = 0, comm_sz = 0, n, local_n = 0;double a , b , h , local_a = 0, local_b = 0;double local_int = 0, total_int = 0;int source;MPI_Init(NULL,NULL);MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);Get_data(my_rank,comm_sz,&a,&b,&n);h = (b - a) / n;           
local_n = n / comm_sz; local_a = a + my_rank*local_n*h;local_b = local_a + local_n*h;local_int = Trap(local_a, local_b, local_n, h);if (my_rank != 0){MPI_Send(&local_int, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD);}else{total_int = local_int;for (source = 1; source < comm_sz; source++){MPI_Recv(&local_int, 1, MPI_DOUBLE, source, 0,MPI_COMM_WORLD, MPI_STATUS_IGNORE);total_int += local_int;}}if (my_rank == 0){printf("With n = %d trapezoids, our estimate\n", n);printf("of the integral from %f to %f = %.15e\n", a, b, total_int);}MPI_Finalize();return 0;
}double Trap(double left_endpt, double right_endpt, double trap_count, double base_len)
{double estimate = 0, x = 0;int i;estimate = (f(left_endpt) + f(right_endpt)) / 2.0;for (i = 1; i <= trap_count - 1; i++){x = left_endpt + i*base_len;estimate += f(x);}estimate = estimate*base_len;return estimate;
}double f(double x)
{return x;
}
void Get_data(int my_rank,int comm_sz,double* a,double* b,int* n)
{
if (my_rank == 0) {printf("Enter a, b, and n \n");scanf("%lf %lf %d", a, b, n);for (int i = 1; i < comm_sz; i++) {MPI_Send(a, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD);MPI_Send(b, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD);MPI_Send(n, 1, MPI_INT, i, 0, MPI_COMM_WORLD);}}else {MPI_Recv(a, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);MPI_Recv(b, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);MPI_Recv(n, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);}}

二、实验运行效果

在这里插入图片描述

三、问题以及思考

问题1:输入函数频繁报错。
解决方法:传过去的参数经过检验是不对的,改变传过去的参数的类型,同时也改变MPI_Send和MPI_Rev的函数的定义。
问题2:求梯形积分的函数返回值存在错误。
解决方法:设置函数类型为double型,接受返回的值为double
实现一一对应。
问题3:还有继续优化的空间。
解决方法:接下来将用广播的方法来实现输入的数传到各个核中去。
问题4:实验结果并不准确当n的值比较小时。
解决方法:与其算法思路有关改变n的值,就会使其更接近正确值,但是n的值较大时,结果又会不够准确,这和浮点数计算精度有关。
(这个避免不了和浮点数计算精度有关,当时想了好久,没想到是本身自己思考的问题,还得细致点,不过现在已经好久没接触分布式了,怀念o(╥﹏╥)o)


总结

本次实验,体验了并行程序中平均分配任务,由各个核分别执行再由一个指定核输出的思想,每个核都独立承担一部分任务,再将计算的结果进行汇总,同时每个核计算时要考虑任务量大小进行分配(梯形积分法由于计算量相近所以可以直接平均分配),并行程序相比普通串行构想思路更难实现更难,但由于其极大地提升了机器的性能,具有极大的学习意义,尤其是对梯形积分法的实现过程无不体现这一思想。
在这里插入图片描述
学累了快来吃一口O(∩_∩)O哈哈~

这篇关于MPI梯形积分法的算法实现(C语言)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/156035

相关文章

R语言中的正则表达式深度解析

《R语言中的正则表达式深度解析》正则表达式即使用一个字符串来描述、匹配一系列某个语法规则的字符串,通过特定的字母、数字及特殊符号的灵活组合即可完成对任意字符串的匹配,:本文主要介绍R语言中正则表达... 目录前言一、正则表达式的基本概念二、正则表达式的特殊符号三、R语言中正则表达式的应用实例实例一:查找匹配

Go语言结构体标签(Tag)的使用小结

《Go语言结构体标签(Tag)的使用小结》结构体标签Tag是Go语言中附加在结构体字段后的元数据字符串,用于提供额外的属性信息,这些信息可以通过反射在运行时读取和解析,下面就来详细的介绍一下Tag的使... 目录什么是结构体标签?基本语法常见的标签用途1.jsON 序列化/反序列化(最常用)2.数据库操作(

基于C++的UDP网络通信系统设计与实现详解

《基于C++的UDP网络通信系统设计与实现详解》在网络编程领域,UDP作为一种无连接的传输层协议,以其高效、低延迟的特性在实时性要求高的应用场景中占据重要地位,下面我们就来看看如何从零开始构建一个完整... 目录前言一、UDP服务器UdpServer.hpp1.1 基本框架设计1.2 初始化函数Init详解

Java中Map的五种遍历方式实现与对比

《Java中Map的五种遍历方式实现与对比》其实Map遍历藏着多种玩法,有的优雅简洁,有的性能拉满,今天咱们盘一盘这些进阶偏基础的遍历方式,告别重复又臃肿的代码,感兴趣的小伙伴可以了解下... 目录一、先搞懂:Map遍历的核心目标二、几种遍历方式的对比1. 传统EntrySet遍历(最通用)2. Lambd

springboot+redis实现订单过期(超时取消)功能的方法详解

《springboot+redis实现订单过期(超时取消)功能的方法详解》在SpringBoot中使用Redis实现订单过期(超时取消)功能,有多种成熟方案,本文为大家整理了几个详细方法,文中的示例代... 目录一、Redis键过期回调方案(推荐)1. 配置Redis监听器2. 监听键过期事件3. Redi

SpringBoot全局异常拦截与自定义错误页面实现过程解读

《SpringBoot全局异常拦截与自定义错误页面实现过程解读》本文介绍了SpringBoot中全局异常拦截与自定义错误页面的实现方法,包括异常的分类、SpringBoot默认异常处理机制、全局异常拦... 目录一、引言二、Spring Boot异常处理基础2.1 异常的分类2.2 Spring Boot默

基于SpringBoot实现分布式锁的三种方法

《基于SpringBoot实现分布式锁的三种方法》这篇文章主要为大家详细介绍了基于SpringBoot实现分布式锁的三种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、基于Redis原生命令实现分布式锁1. 基础版Redis分布式锁2. 可重入锁实现二、使用Redisso

SpringBoo WebFlux+MongoDB实现非阻塞API过程

《SpringBooWebFlux+MongoDB实现非阻塞API过程》本文介绍了如何使用SpringBootWebFlux和MongoDB实现非阻塞API,通过响应式编程提高系统的吞吐量和响应性能... 目录一、引言二、响应式编程基础2.1 响应式编程概念2.2 响应式编程的优势2.3 响应式编程相关技术

C#实现将XML数据自动化地写入Excel文件

《C#实现将XML数据自动化地写入Excel文件》在现代企业级应用中,数据处理与报表生成是核心环节,本文将深入探讨如何利用C#和一款优秀的库,将XML数据自动化地写入Excel文件,有需要的小伙伴可以... 目录理解XML数据结构与Excel的对应关系引入高效工具:使用Spire.XLS for .NETC

Nginx更新SSL证书的实现步骤

《Nginx更新SSL证书的实现步骤》本文主要介绍了Nginx更新SSL证书的实现步骤,包括下载新证书、备份旧证书、配置新证书、验证配置及遇到问题时的解决方法,感兴趣的了解一下... 目录1 下载最新的SSL证书文件2 备份旧的SSL证书文件3 配置新证书4 验证配置5 遇到的http://www.cppc