利用矩形规则计算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); //将进程0的gl_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;
}