我的第一个MPI程序:利用矩形规则计算pi

利用矩形规则计算pi

#include<mpi.h>

#include<iostream>

using namespace std;

 

const int INTERVALS = 40000;

 

int main(int argc,char ** argv)

{

         int rank,size;

 

         double area = 0;

         double gl_area = 0;

 

         double runtime;

 

         double x;

 

         MPI_Init(&argc,&argv);

 

         runtime = -MPI_Wtime();

 

         MPI_Comm_size(MPI_COMM_WORLD,&size);

 

         MPI_Comm_rank(MPI_COMM_WORLD,&rank);

 

         for(int i = rank *(INTERVALS / size); i < (rank+1)*(INTERVALS / size); i++)

         {

                   x = (1.0/INTERVALS) * (i+0.5);

 

                   area += 4.0 /(1.0 + x*x) * (1.0/INTERVALS); //*

         }

 

         printf("Proces: %d area: %lf\n",rank,area);

 

         MPI_Reduce(&area,&gl_area,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD);

 

         runtime += MPI_Wtime();

 

         printf("runtime %lfms\n",runtime*1000);

 

         MPI_Finalize();

 

         if(rank == 0)

                   printf("gl_area: %.16lf\n",gl_area);

 

         return 0;

}

 



以下是MPI_Reduce() / 

利用MPI_Bcast() /

MPI_Allgather()

   将结果都保存到所有进程中


 

#include<mpi.h>

#include<iostream>

using namespace std;

 

const int maxn = 8;

 

int val[maxn]; 

int VAL[maxn];//用于保存最终的结果

 

int main(int argc,char *argv[])

{

         int rank,size;

 

         double runtime;

 

         int ans=0, gl_ans = 0;

 

         MPI_Init(&argc,&argv);

 

         MPI_Barrier(MPI_COMM_WORLD);

 

         runtime = -MPI_Wtime();

 

         MPI_Comm_size(MPI_COMM_WORLD,&size);

         MPI_Comm_rank(MPI_COMM_WORLD,&rank);

 

 

         for(int i = rank * (maxn / size); i< (rank+1) * (maxn / size); i ++)

         {

                   val[i] = i;

                   ans += i;

         }

 

         printf("ProcessID : %d\n",rank);

 

         printf("ans: %d\n",ans);

 

        

         //MPI_Reduce(void *operand,void *result, int count,MPI_Datatype type, MPI_Op operator, int root, MPI_Comm comm);

         MPI_Reduce(&ans,&gl_ans,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);

 

         MPI_Barrier(MPI_COMM_WORLD);  //这里的阻塞,保证全部进程已完成归约,进程0得到正确结果后,才可以所这个值广播出去

 

         //MPI_Bcast(void *buffer,int size,MPI_Datatype, int root,MPI_COMM);

         MPI_Bcast(&gl_ans,1,MPI_INT,0,MPI_COMM_WORLD);   //将进程0gl_ans广播到其它进程

 

         //全收集各进程的val数组的值,使每个进程都含有完整的val数组

 

         //MPI_Allgather(void* send_buffer,int sent_size,MPI_Datatype,  void* recv_buffer,int recv_size,MPI_Datatype,MPI_COMM)

         MPI_Allgather(&val[rank * (maxn / size)],(maxn / size),MPI_INT,VAL,(maxn / size),MPI_INT,MPI_COMM_WORLD);

 

 

         runtime += MPI_Wtime();

         printf("runtime: %.1lfms\n",runtime * 1000);

 

         MPI_Finalize();

 

         printf("val:");

         for(int i=0; i<maxn; i++)   //从这里可以看出,这些变量(包括数组),都是每个主机的私有变量,哈哈,这是明显的,因为这个消息传递的,并不是共享内存的

                   printf("%d ",val[i]);

         printf("\n");

        

         printf("VAL:");             //输出全收集后的结果VAL

         for(int i=0; i<maxn; i++) 

                   printf("%d ",VAL[i]);

         printf("\n");

 

         //if(rank == 0)

                   printf("gloal_ans: %d\n\n",gl_ans);

 

         return 0;

}

 


//利用MPI_Reduce()MPI_Gather()将数据都存放到进程0

 

#include<mpi.h>

#include<iostream>

using namespace std;

 

const int maxn = 8;

 

int val[maxn]; 

int VAL[maxn];//用于保存最终的结果

 

int main(int argc,char *argv[])

{

         int rank,size;

 

         double runtime;

 

         int ans=0, gl_ans = 0;

 

         MPI_Init(&argc,&argv);

 

         MPI_Barrier(MPI_COMM_WORLD);

 

         runtime = -MPI_Wtime();

 

         MPI_Comm_size(MPI_COMM_WORLD,&size);

         MPI_Comm_rank(MPI_COMM_WORLD,&rank);

 

 

         for(int i = rank * (maxn / size); i< (rank+1) * (maxn / size); i ++)

         {

                   val[i] = i;

                   ans += i;

         }

 

         printf("ProcessID : %d\n",rank);

 

         printf("ans: %d\n",ans);

 

        

         //MPI_Reduce(void *operand,void *result, int count,MPI_Datatype type, MPI_Op operator, int root, MPI_Comm comm);

         MPI_Reduce(&ans,&gl_ans,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);

 

         MPI_Barrier(MPI_COMM_WORLD);  //这里的阻塞,保证全部进程已完成部分val数组的计算,可以提供给进程0进行收集

 

         //MPI_Gather(void* sentbuf,int sentcnt,MPI_Datatype senttype,  void* recvbuff,int recvcnt,MPI_Datetype recvtype,root,MPI_COMM);  //root进程收集所有进程的数据

         MPI_Gather(&val[rank * (maxn / size)],(maxn / size),MPI_INT,  VAL,(maxn / size),MPI_INT,0,MPI_COMM_WORLD);

 

         runtime += MPI_Wtime();

         printf("runtime: %.1lfms\n",runtime * 1000);

 

         MPI_Finalize();

 

         printf("val:");

         for(int i=0; i<maxn; i++)   //从这里可以看出,这些变量(包括数组),都是每个主机的私有变量,哈哈,这是明显的,因为这个消息传递的,并不是共享内存的

                   printf("%d ",val[i]);

         printf("\n");

        

         printf("VAL:");             //输出全收集后的结果VAL

         for(int i=0; i<maxn; i++) 

                   printf("%d ",VAL[i]);

         printf("\n");

 

         //if(rank == 0)

                   printf("gloal_ans: %d\n\n",gl_ans);

 

         return 0;

}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值