#include <stdio.h>
#include <math.h>
#include <mpi.h>
int main(int argc, char *argv[]) {
//初试化一个用来保存并行和的中间单位cur,一个主线程的pi
double pi ,cur;
//n变量代表是把[0,1]分成2000份
int n = 2000;
//size变量用来拿到是分配的线程数,
//rank变量代表
int size, rank;
MPI_Init(&argc, &argv);// 初始化时是调用时从外边传进来的
MPI_Comm_size(MPI_COMM_WORLD, &size);//进程数
MPI_Comm_rank(MPI_COMM_WORLD, &rank);//进程标识符 ,从0开始
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD); //将n广播到所有进程中 INT?
//中间单位cur初始化为0,为了累加
cur=0.0;
//为了并行叠加
for(int i=rank+1; i<=n; i+=size) {
double x = (1.0/n) *((double)i - 0.5);
cur = cur + 4/(1+x*x);
}
cur *= 1.0/n;
MPI_Reduce(&cur, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
//cur 为发送,pi为接收
//1条数据量,利用归约操作(MPI_SUM)将所有进程的sum累加到root进程(0)的sum当中得到结果
if (rank == 0)
{
printf("%.16lf",pi);
}
MPI_Finalize();
}
```
12-10