当前位置:首页>>VS2019 MPI计算PI

VS2019 MPI计算PI

  • mpi |VS2019
  • 2022-07-15 16:41:05
//#include "mpi.h"
//#include<iostream>
//using namespace std;
//int main(int argc,char *argv[]) 
//{	
//
//	int myid, numprocs, namelen;
//	char process_name[MPI_MAX_PROCESSOR_NAME];
//	MPI_Init(&argc,&argv);
//	MPI_Comm_rank(MPI_COMM_WORLD,&myid);
//	MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
//	MPI_Get_processor_name(process_name,&namelen);
//	if(myid==0)
//	{
//		cout << "number of processes: " << numprocs << endl;
//	}
//	cout << process_name<< ": Hello world from process "<<myid << endl;
//
//	MPI_Finalize();
//	return 0;
//
//
//
//
//}
//ctrl+k+U 取消注释
//ctrl+k+C 添加注释
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include "mpi.h"

int main(int argc,char* argv[])
{
	long npoints ;
	double circle_count = 0; 
	double sum_c = 0;
	int myid, numprocs, name_length;
	char procs_name[MPI_MAX_PROCESSOR_NAME];
	MPI_Init(&argc, &argv);
	MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
	MPI_Comm_rank(MPI_COMM_WORLD,&myid);
	MPI_Get_processor_name(procs_name, &name_length);
	MPI_Status status;
	int i,j;
	srand((int)time(0));
	double x, y, pi, sum = 0.0, PII = 3.1415926535897932384643;
	if(myid==0)
	{
		npoints = 1000000;
		for (j = 1; j < numprocs; j++) {
			MPI_Send(&npoints, 1, MPI_LONG, j, 0, MPI_COMM_WORLD);
//			printf("0Send->%d\n", j);
		}
	}
	else {
		MPI_Recv(&npoints, 1, MPI_LONG, 0, 0, MPI_COMM_WORLD, &status);
//		printf("0Recv->%d\n", myid);
	}

	for(i=myid;i<npoints;i+=numprocs)
	{	//rand() return[0,RAND_MAX]->rand() / (RAND_MAX + 1) [0,1) ->rand() / (RAND_MAX ) [0,1]
		x = rand() / (RAND_MAX +0.0);
		y = rand() / (RAND_MAX +0.0);
		if((x-1)*(x-1)+(y-1)*(y-1)<=1)
		{
			circle_count = circle_count + 1;
		}
	}
	MPI_Reduce(&circle_count,&sum_c,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD);
	if (myid == 0) {
		pi = 4.0 * sum_c / npoints;
		printf("%lf\n", pi);
		printf("%lf", pi - PII);
	}

	MPI_Finalize();
	return 0;
}

猜你喜欢