并行计算的分析过程
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