我们现在使用MPI 来对一个SIN 函数进行定积分求面积的计算。
简单说下定积分,定积分根据将X划分为一个一个的小梯形,将面积球和之后近似于目标面积。

如上图所示,我们需要的是使用MPI 将整个图形分解成N 个梯形,其中每一个梯形的面积开一个进程来计算,然后使用MPI 的规约求和函数来计算最终的结果。
#include<stdio.h>
#include<stdlib.h>
#include<mpi.h>
#include<math.h>
const double a = 0.0;
const double b = 3.14;
int n  = 100;
/*计算梯形面积的函数*/
double sum_quer(double a,double b,int n,double h){
double *x = (double *)malloc(sizeof(double) * (n + 1));
double *f = (double *)malloc(sizeof(double) * (n + 1));
double inte = (sin(a) + sin(b)) /2;
for(int i = 0;i < (n+1);i++){
x[i] = x[i-1] + h;
f[i] = sin(x[i]);
inte += f[i];
}
inte = inte*h;
return 0;
}
int main(int argc,char **argv){
int myid,nprocs;
int local_n;
double local_a;
double local_b;
double total_inte;
MPI_Init(&argc,&argv);      /*初始化MPI 系统*/
MPI_Comm_rank(MPI_COMM_WORLD,&myid); /*设置当前通信子*/
MPI_Comm_size(MPI_COMM_WORLD,&nprocs);/*设置工作进程个数*/
local_n = n / nprocs;
int h = (b - a)/n;
local_a = a + myid *local_n*h;
local_b = local_a + local_n * h;
double local_inte = sum_quer(local_a,local_b,local_n,h);
MPI_Reduce(&local_inte,&total_inte,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD);  /*规约各个计算结果*/
if(myid == 0){
printf("integral out put is %d",total_inte);
}
MPI_Finalize();
return 0;
}
这里还有几个小点需要注意。
关于IO处理。
我们的程序是SPMD 类型的,程序只需要编写一次然后多进程执行罢了,但是如果我们需要输入数据呢?比如使用scanf 来输入数据?
解决方法:给0号进程编写scanf 函数,其他的进程使用 MPI_Send 来接受变量。
#include<stdio.h>
#include<mpi.h>
void get_data(){
int my_rank;
int comm_zz;
double *a;
double *b;
int    *n;
int  dest;
if(my_rank == 0){   /*如果是0号进程就接受并发送数据*/
scanf("%lf %lf %d",a,b,n);
for(dest = 0;dest < comm_zz;dest++){
MPI_Send(a,1,MPI_DOUBLE,dest,0,MPI_COMM_WORLD);
MPI_Send(b,1,MPI_DOUBLE,dest,0,MPI_COMM_WORLD);
MPI_Send(n,1,MPI_INT,dest,0,MPI_COMM_WORLD);
}
}else{            /*其他进程接受参数*/
MPI_Recv(a,1,MPI_DOUBLE,0,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
MPI_Recv(b,1,MPI_DOUBLE,0,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
MPI_Recv(n,1,MPI_INT,0,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
}
}
MPI_Reduce

全局规约函数,很简单,最核心的是第五个参数操作符参数,根据不同的参数我们可以实现不同的功能。
MPI 中定义的规约操作符
MPI_MAX               最大值
MPI_MIN                最小值
MPI_SUM               累加和
MPI_PROD            累乘积
MPI_LAND            逻辑与
MPI_BAND            按位于
MPI_LOR               逻辑或
MPI_BOR               按位或
MPI_LXOR            逻辑异或
MPI_BXOR            按位异或
MPI_MAXLOC      求最大值和位置
MPI_MINLOC       求最小值和位置
集和通信与点对点通信
1.在通信子中的所有进程都必须调用相同的集和通信函数
2.每个进程传递给MPI集合通信函数的参数必须是相融的
3.参数output_data_p 只用在dest_process 上。
4.点对点通信函数是通过标签和通信子来匹配的。集合通信函数不使用标签,只通过通信子和调用顺序来进行匹配。

查看原文:http://zmrlinux.com/2017/01/24/%e4%bd%bf%e7%94%a8mpi-%e8%ae%a1%e7%ae%97%e7%a7%af%e5%88%86/

使用MPI 计算积分相关推荐

  1. c语言simpson积分计算方法,数值分析复化Simpson积分公式和复化梯形积分公式计算积分的通用程序...

    数值分析复化Simpson积分公式和复化梯形积分公式计算积分的通用程序 数值分析第五次程序作业 PB09001057 孙琪 [问题] 分别编写用复化Simpson积分公式和复化梯形积分公式计算积分的通 ...

  2. c语言龙贝格积分法实验报告,数值作业:龙贝格算法计算积分C语言实现

    数值作业:龙贝格算法计算积分C语言实现 数值作业:龙贝格算法计算积分C语言实现 根据Romberg算法计算定积分,和变步长的Simpson算法的输入都一样.算法基本分析:输入a,b(积分上下限),n为 ...

  3. python怎么算积分_python计算积分

    python有多个方法计算积分,下面介绍其中三个,以下式为例: 方法一:直接用numpy计算 start = 1 stop = 2 length = 101 x = np.linspace(start ...

  4. 一段C#学习代码(实现通过积分的几何意义计算积分)

    2019独角兽企业重金招聘Python工程师标准>>> 1.本段程序实现的功能 1)通过积分的几何意义计算积分:计算函数曲线与坐标轴围成部分的面积,方法为将面积分为小块的矩形,依次计 ...

  5. 用正割对数计算积分的方法

    用正割对数计算积分的方法 下面介绍一种利用正割对数,计算积分的方法. 相关资料下载网址: 链接:https://pan.baidu.com/s/1z3R9b-UmV3AcJKLPFNNT3A?pwd= ...

  6. 幂级数展开求积分_[干货]---如何利用留数定理计算积分

    留下来的都是精华. 留数理论的一个重要应用就是用来计算实函数的积分,我们先从复变函数的孤立奇点的分类将起: 定义: 是一个全纯函数: 当存在一个半径 时,有 时.这时称 为复变函数 的一个孤立奇点.现 ...

  7. matlab实验求不定积分函数,实验四用matlab计算积分

    实验四用matlab计算积分 实验四 用matlab计算积分 4.1积分的有关理论 定积分:积分是微分的无限和,函数在区间上的积分定义为 其中 从几何意义上说,对于上非负函数,记分值是曲线与直线及轴所 ...

  8. Gauss-legendre求积公式计算积分

    数值分析 分别取不同n值利用Gauss-legendre求积公式计算积分: ∫−4411+x2dx\int_{-4}^{4}\frac{1}{1+x^{2}}dx∫−44​1+x21​dx 以下为MA ...

  9. LA3485二分+求解积分方程+辛普森算法计算积分

    1 /*LA3485: 2 求解积分方程 3 关于这道题的数学模型: 4 给定抛物线长度L,抛物线函数f(x)=a(x-d)(x+d),求解 |a*d*d|的值,a>0,曲线积分函数lf(x)= ...

最新文章

  1. [考试]20151013搜索
  2. 从6篇经典论文看问题生成及其相关技术
  3. 基于abtest思想的流量切换(nginx lua redis)
  4. android 长按 秒事件_原来手机长按2秒,能开启5个实用功能,一键提取图片上的文字...
  5. 服务器系统怎么写,服务器操作系统语言写的
  6. 数字能排序字符串不能排序_动图解说堆排序原理,让体育生也能看得明白
  7. 网站网络流量的极限,你考虑过么?
  8. vs2015连接oracle(11g)的方法
  9. iphone手机html视频播放,iphone5视频格式 传到苹果手机上的视频怎么才能看
  10. 2021新跨域问题:insecure private network requests
  11. 数字图像处理 笔记--2
  12. Listary 配置常用搜索
  13. coc机器人苹果_警察机器人绳索英雄
  14. 寄存器(RAL)模型中的write方法
  15. html中写双柱状图,7.2 创建柱状图 - HTML5 Canvas 实战
  16. websocket实现消息群发
  17. Python的异常及处理
  18. 三子棋实现(多子棋实现)
  19. input禁止光标_input 不可输入,且禁止光标显示的几种方案兼容iphone5(se)
  20. 数据输入、转换、展示和存储 - 网络统计学类函数(1)

热门文章

  1. crazy的比较级最高级_小学英语比较级和最高级知识点
  2. 测试需要理解的产品设计原则
  3. 戴维宁定理等效电压源
  4. Java修炼之凡界篇 筑基期 第05卷 数组 第07话 冒泡排序
  5. 学生成绩管理系统软件测试毕业设计,软件测试《学生成绩管理系统》测试资料报告材料.doc...
  6. ISIS(中间系统到中间系统)概述
  7. 计算机二级身0准1,计算机二级-24-1.字处理题(小郑-准考证)
  8. 日照分析的计算机精度,郴州市规划局建筑工程日照分析技术规定(试行)
  9. 大连理工学php,大连理工大学教务处(大连理工大学国内交换生)
  10. 教学管理系统E-R建模