用mpi实现积分运算求π值
这篇文章例子来自于 https://zhuanlan.zhihu.com/p/399150417
思想参考于我之前这篇博客 https://www.cnblogs.com/algoshimo/p/18063325
中若线程不够用的情况
# include "mpi.h"
# include<stdio.h>
double f(double);
double f(double x)
{
return (4.0/(1.0+x*x));
}
int main(int argc , char *argv[])
{
int myid , numprocs;
int n , i;
double mypi , pi;
double h , sum , x;
//任何MPI程序都应该首先调用该函数。 保证程序中第一个调用的MPI函数是这个函数
MPI_Init(&argc , &argv);
//获取当前MPI通信域(通常是MPI_COMM_WORLD,表示所有可用进程)中的进程数量
//并将结果存储在numprocs变量中
MPI_Comm_size(MPI_COMM_WORLD , &numprocs);
//获取当前进程在MPI通信域中的标识号(即rank),并将结果存储在myid变量中
MPI_Comm_rank(MPI_COMM_WORLD , &myid);
printf("Process %d of %d\n", myid, numprocs);
n = 100;h = 1.0/(double)n;
sum = 0.0;
for(i = myid+1;i<=n;i+=numprocs)
{
x = h*( (double)i - 0.5);
sum+=f(x);
}
mypi = h*sum;
//MPI的规约操作
//将每个进程中的一个double类型的值mypi,按照求和的方式汇总到进程0中的变量pi中
MPI_Reduce(&mypi , &pi , 1 , MPI_DOUBLE , MPI_SUM , 0 , MPI_COMM_WORLD);
if(myid == 0) printf("result is %.10f.\n" , pi);
MPI_Finalize();
}