并行计算程序-梯形积分法
作者:互联网
并行计算的分析过程
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;
}
标签:title,int,double,梯形,rank,MPI,并行计算,积分法,进程 来源: https://blog.csdn.net/qq_43390943/article/details/88922235