matrix9

来源:互联网 发布:数控编程培训班 编辑:程序博客网 时间:2024/06/11 02:14
//http://www.cnblogs.com/sdxk/p/4093484.html//Oct 9 2016//monte carlo method to calculate pi#include<stdio.h>#include<stdlib.h>#include<math.h>#include<time.h>#include<mpi.h>void read_num(long long int *num_point,int my_rank,MPI_Comm comm);void compute_pi(long long int num_point,long long int* num_in_cycle,long long int* local_num_point,int comm_sz,long long int *total_num_in_cycle,MPI_Comm comm,int my_rank);int main(int argc,char** argv){    long long int num_in_cycle,num_point,total_num_in_cycle,local_num_point;    int my_rank,comm_sz;    MPI_Comm comm;    MPI_Init(NULL,NULL);//初始化    comm=MPI_COMM_WORLD;    MPI_Comm_size(comm,&comm_sz);//得到进程总数    MPI_Comm_rank(comm,&my_rank);//得到进程编号    read_num(&num_point,my_rank,comm);//读取输入数据    compute_pi(num_point,&num_in_cycle,&local_num_point,comm_sz,&total_num_in_cycle,comm,my_rank);    MPI_Finalize();    return 0;}void read_num(long long int* num_point,int my_rank,MPI_Comm comm){    if(my_rank==0){        printf("please input num in sqaure \n");        scanf("%lld",num_point);    }    /*    广播函数    int MPI_Bcast(        void*    data_p //in/out        int    count  //in        MPI_Datatype    datatype //in        int    source_proc  //in        MPI_Comm    comm  //in        )    */    MPI_Bcast(num_point,1,MPI_LONG_LONG,0,comm);}void compute_pi(long long int num_point,long long int* num_in_cycle,long long int* local_num_point,int comm_sz,long long int *total_num_in_cycle,MPI_Comm comm,int my_rank){    *num_in_cycle=0;    *local_num_point=num_point/comm_sz;    double x,y,distance_squared;     srand(time(NULL));    for(long long int i=0;i< *local_num_point;i++){             x=(double)rand()/(double)RAND_MAX;        x=x*2-1;        y=(double)rand()/(double)RAND_MAX;        y=y*2-1;        distance_squared=x*x+y*y;        if(distance_squared<=1)        *num_in_cycle=*num_in_cycle+1;    }    /*    全局函数    MPI_Reduce(        void*    input_data_p    //in        void*    output_data_p    //out        int    count        //in        MPI_Datatype    datatype     //in        MPI_Op    oprtator    //in        int    dest_process    //in        MPI_Comm    comm    //in    )        */      MPI_Reduce(num_in_cycle,total_num_in_cycle,1,MPI_LONG_LONG,MPI_SUM,0,comm);    if(my_rank==0){        double pi=(double)*total_num_in_cycle/(double)num_point*4;        printf("the estimate value of pi is %lf\n",pi);    }}

0 0
原创粉丝点击