用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();
}

posted @ 2024-03-23 22:02  拾墨、  阅读(33)  评论(0编辑  收藏  举报