利用矩形规则计算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;
}