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

相关文章

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

java如何分布式锁实现和选型

《java如何分布式锁实现和选型》文章介绍了分布式锁的重要性以及在分布式系统中常见的问题和需求,它详细阐述了如何使用分布式锁来确保数据的一致性和系统的高可用性,文章还提供了基于数据库、Redis和Zo... 目录引言:分布式锁的重要性与分布式系统中的常见问题和需求分布式锁的重要性分布式系统中常见的问题和需求

SpringBoot基于MyBatis-Plus实现Lambda Query查询的示例代码

《SpringBoot基于MyBatis-Plus实现LambdaQuery查询的示例代码》MyBatis-Plus是MyBatis的增强工具,简化了数据库操作,并提高了开发效率,它提供了多种查询方... 目录引言基础环境配置依赖配置(Maven)application.yml 配置表结构设计demo_st

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

el-select下拉选择缓存的实现

《el-select下拉选择缓存的实现》本文主要介绍了在使用el-select实现下拉选择缓存时遇到的问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录项目场景:问题描述解决方案:项目场景:从左侧列表中选取字段填入右侧下拉多选框,用户可以对右侧

Python pyinstaller实现图形化打包工具

《Pythonpyinstaller实现图形化打包工具》:本文主要介绍一个使用PythonPYQT5制作的关于pyinstaller打包工具,代替传统的cmd黑窗口模式打包页面,实现更快捷方便的... 目录1.简介2.运行效果3.相关源码1.简介一个使用python PYQT5制作的关于pyinstall

使用Python实现大文件切片上传及断点续传的方法

《使用Python实现大文件切片上传及断点续传的方法》本文介绍了使用Python实现大文件切片上传及断点续传的方法,包括功能模块划分(获取上传文件接口状态、临时文件夹状态信息、切片上传、切片合并)、整... 目录概要整体架构流程技术细节获取上传文件状态接口获取临时文件夹状态信息接口切片上传功能文件合并功能小

python实现自动登录12306自动抢票功能

《python实现自动登录12306自动抢票功能》随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行... 目录一、遇到的问题?二、改进三、进阶–展望总结一、遇到的问题?1.url-正确的表头:就是首先ur

C#实现文件读写到SQLite数据库

《C#实现文件读写到SQLite数据库》这篇文章主要为大家详细介绍了使用C#将文件读写到SQLite数据库的几种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录1. 使用 BLOB 存储文件2. 存储文件路径3. 分块存储文件《文件读写到SQLite数据库China编程的方法》博客中,介绍了文