并行计算程序-梯形积分法

匿名 (未验证) 提交于 2019-12-02 23:26:52

并行计算的分析过程

1、将问题分解为多个子问题
2、为每个进程分配求解任务
3、将求解的结果汇总计算
并行程序设计与分治法的分析过程类似,如果想了解分治法的设计思路
算法设计与分析之分治法
并行程序相比较与串行程序的优点是:它很好地利用的cpu的资源,使得多个处理器同时解决一个问题。
这里我们计算 f(x) = x^2 + 2*x + 1;函数在 [0,3] 上的面积
代码中MPI的安装使用可以在网上找一些资料进行了解。

MPI 与普通的c程序在编译与执行命令上有写不同

mpicc -o test test.c 编译命令
mpirun -np 4 ./test 执行命令(用四个进程并行执行该程序)

#include <stdio.h> #include "mpi.h" #include <unistd.h>  //二次函数 double Fun(double x) {     return x*x+2*x+1;     }  //单个进程之间的面积求解 //n 表示累加的次数,m 表示相邻元素间的跨度 double Area(int n,double m,double start) {     double title_d = 0;     int i = 0;     for(; i < n; i++)     {         double tmp = Fun(start);         double area = m*tmp;         title_d += area;         start += m;     }     //printf("进程号:%d = >%f\n",getpid(),title_d);     return title_d; }  int main() { 	//rank 表示当前的进程号 	//size 表示进程的总数     int rank,size; 	 	//求解的区间[0,3]     double a = 0.0,b = 3.0;     //将区间分成1024份     int num = 1024;      //初始化     MPI_Init(NULL,NULL);     //获取当前的进程号 从0开始 不是pid     MPI_Comm_rank(MPI_COMM_WORLD,&rank);     //获取进程的个数     MPI_Comm_size(MPI_COMM_WORLD,&size);          //分成的1024份,计算出每份的宽度     double m = (b-a)/num;     //计算每个进程需要计算的次数     int n = num/size;  	//     double start = a + rank*m*n;     double title_int = Area(n,m,start);     if(rank != 0)     {     	//MPI_Send() 用于进程间通信的函数,     	//在这里将计算的结果发送给0号进程     	//0号进程用于统计所有的结果         MPI_Send(&title_int,1,MPI_DOUBLE,0,0,MPI_COMM_WORLD);     }     else     {         double title = 0.0;         int i = 0;         for(i = 1; i < size; i++)         {         //0号进程统计所有的计算结果             title += title_int;    MPI_Recv(&title_int,1,MPI_DOUBLE,i,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);         }         title += title_int;         printf("面积:%f\n",title);     }          //结束释放资源     MPI_Finalize();     return 0;     } 
文章来源: https://blog.csdn.net/qq_43390943/article/details/88922235
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!