mpi点对点通信求函数积分

mpi简介

MPI是Message Passing Interface的缩写,MPI是一个跨语言的通讯协议,用于编写并行计算机。支持点对点和广播。MPI是一个信息传递应用程序接口,包括协议和和语义说明,他们指明其如何在各种实现中发挥其特性。MPI的目标是高性能,大规模性,和可移植性。

MPI 点对点通信实验

求函数的积分

mpi点对点通信求函数积分

我们知道求一个函数的积分可以转换为求函数与坐标轴之间的面积。如下图:
mpi点对点通信求函数积分
我们计算积分的思想就是将整个a到b这一段分成p个区域,将这p个区域交给p个计算机计算每个区域的面积,而对于每一个计算机所要计算的区域,又可以分成n个大小为h的区域,每一台计算机只需要计算这n个区域面积的累加和,最后汇总到一个节点即可。
mpi点对点通信求函数积分
代码如下

#include<stdio.h>
#include"mpi.h"
#include<math.h>

int main (int argc, char **argv){
    MPI_Comm comm= MPI_COMM_WORLD;
    MPI_Status status;
    int size,rank;
    double a,b,h,sum,tmp;
    const double pi=acos(-1.0);
    int n,j;

    MPI_Init(&argc,&argv);

    MPI_Comm_size(comm,&size);
    MPI_Comm_rank(comm,&rank);

    if(rank == 0){
        printf("Input n\n");
        scanf("%d",&n);

        printf("Input a&b\n");
        scanf("%lf%lf",&a,&b);
        for(j = 1;j<size;j++)
        {
            MPI_Send(&n,1,MPI_INT,j,99,comm);
            MPI_Send(&a,1,MPI_DOUBLE,j,99,comm);
            MPI_Send(&b,1,MPI_DOUBLE,j,99,comm);
        }

    }
    else{
        MPI_Recv(&n,1,MPI_INT,0,99,comm,&status);
        MPI_Recv(&a,1,MPI_DOUBLE,0,99,comm,&status);
        MPI_Recv(&b,1,MPI_DOUBLE,0,99,comm,&status);
    }
    a = a * pi;
    b = b * pi;
    h = (b-a)/size/n;
    sum = 0;
    for(j = 0;j < n;j++){
        tmp = (a + (rank*n + j)*h) + h/2;
        sum += cos(tmp)*h;
    }
    printf("%lf\n",sum);

    if(rank == 0){
        for(j = 1;j < size;j++){
            MPI_Recv(&tmp,1,MPI_DOUBLE,j,99,comm,&status);
            sum += tmp;
        }
    }
    else{
        MPI_Send(&sum,1,MPI_DOUBLE,0,99,comm);
    }

    if(rank == 0)
    {
        printf("Result of MPI: %lf\n",sum);
        printf("Answer: %lf\n",sin(b)-sin(a));
    }
    MPI_Finalize();
    return 0;
}