并行计算:圆周率计算

数学

\frac{\pi}{4} = \int_{0}^{1}\frac{1}{1+x^2}dx

思想

把0-1下面积分为n个小矩形,再每个处理器上处理一部分面积,最后加起来
比较重要的是for (i = myid + 1; i <= n; i += numprocs)来分配每个处理器计算的矩形id,很巧妙

代码

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

double f(double);

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

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

    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &numproc);
    MPI_Comm_rank(MPI_COMM_WORLD, &myid);

    n = 100000000;
    
    startwtime = MPI_Wtime();
    h = 1.0 / double(n);
    sum = 0.0;

    for (i = myid + 1; i <= n; i += numproc) {
        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, fabs(pi - PI25DT));
        printf("wall clock time = %f\n", endwtime);
        fflush(stdout);
    }

    MPI_Finalize();
    return 0;
}
performance
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这个不错分享给大家,从扣上看到的,就转过来了 《电脑专业英语》 file [fail] n. 文件;v. 保存文...
    麦子先生R阅读 11,719评论 5 24
  • 《ilua》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 1...
    叶染柒丶阅读 13,778评论 0 11
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 8,706评论 0 2
  • 今天开始要复习笑来老师关于投资的文章了,以前看过的内容现在已经没有印象了,更别说照着做了。虽然是讲投资的,但是之前...
    李大刀阅读 3,434评论 1 47
  • 尊敬的Ulord基金会: 我是夏炬,郑重宣布参加Ulord主节点竞选! 2017年开始接触区块链,当我第一次听到“...
    夏表哥阅读 1,631评论 0 3