MPI程序实例:数值积分(π值计算)

目录

一、算法介绍

二、代码实现


一、算法介绍

        本程序实例通过下面的公司计算定积分\pi = \int_{0}^{1} 4/(1+x^{2})dx的近似值:

h\sum_{i=0}^{n-1}f(x_{i})                                                              (1)

其中n>0为积分区间数,h=1/n为积分步长,x_{i}=(i+0.5)h\;\;\;(i=0,1,\cdots,n-1)为积分区间的中点,被积函数f(x)=4/(1+x^{2})

        假设总进程数为p(程序中的numprocs变量),各进程分别负责计算公式(1)中的一部分计算区间,然后再调用MPI_Reduce将各进程的结果加起来。代码中计算区间采用循环分配的方式,即将计算公式写成:

\sum_{k=0}^{p-1} h \sum _{0\leqslant j<n,j\;mod \;p=k}f(x_{j})

        每个进程独立计算上式中的一个内层求和,然后再将这项结果加起来。

二、代码实现

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

double f(double a) {return (4.0/(1.0 + a*a));}

int main(int argc, char *argv[])
{
    int n, myid, numprocs, i, namelen;
    double PI25DT = 3.141592653589793238462643;
    double mypi, pi, h, sum, x;
    double startwtime, endwtime;
    char processor_name[MPI_MAX_PROCESSOR_NAME];

    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &numproces);
    MPI_Comm_rank(MPI_COMM_WORLD, &myid);
    MPI_Get_processor_name(processor_name, &namelen)

    printf("Process %d on %s.\n", myid, processor_name);

    if(myid == 0)
    {
        n = 10000;
        startwtime = MPI_Wtime();
    }

    MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);

    h = 1.0/(double) n;
    sum = 0.0;
    for(i = myid; i < n; i += numprocs)
    {
        x = h * ((double) i + 0.5);
        sum += f(x);
    }

    mypi = h * sum;

    MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

    if(myid == 0)
    {
        endwtime = MPI_Wtime();
        printf("PI is approximately %.16f, error is %.16f. \n", pi, pi - PI25DT);
        printf("Wall clock time = %f.\n", endwtime - startwtime);
    }
    
    MPI_Finalize();

    return 0;
}

        编译并运行上述代码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿核试Bug愁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值