matrix9

//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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值