mpi点对点通信求函数积分
mpi简介
MPI是Message Passing Interface的缩写,MPI是一个跨语言的通讯协议,用于编写并行计算机。支持点对点和广播。MPI是一个信息传递应用程序接口,包括协议和和语义说明,他们指明其如何在各种实现中发挥其特性。MPI的目标是高性能,大规模性,和可移植性。
MPI 点对点通信实验
求函数的积分
我们知道求一个函数的积分可以转换为求函数与坐标轴之间的面积。如下图:
我们计算积分的思想就是将整个a到b这一段分成p个区域,将这p个区域交给p个计算机计算每个区域的面积,而对于每一个计算机所要计算的区域,又可以分成n个大小为h的区域,每一台计算机只需要计算这n个区域面积的累加和,最后汇总到一个节点即可。
代码如下
#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;
}