编程语言
首页 > 编程语言> > 并行计算程序-梯形积分法

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

作者:互联网

并行计算的分析过程

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