<pre name="code" class="cpp">#include "mpi.h"
#include "stdio.h"
#define N 4
#define steps 3
/*************************************************************************************
*此函数实现:进程0里面A[i]++;A[0]=A[0]+B[0]; 进程1里面实现:B[i]++;B[0]=A[0]+B[0];
*并实现了计算与通信重叠
*************************************************************************************/
void Send_Recv_Init(int myid)
{
int i,j;
int P[N];
int buf;
int dest=(myid+1)%2;
int tag=99;
MPI_Request req[2];
MPI_Status status[2];
//初始化
for(i=0;i<N;i++)
P[i]=myid+1;
printf("进程%d里面初始化数组为: ",myid);
for(j=0;j<N;j++)
printf("%3d",P[j]);
printf("\n");
MPI_Send_init(&P,1,MPI_INT,dest,tag,MPI_COMM_WORLD,&req[0]);
MPI_Recv_init(&buf,1,MPI_INT,dest,tag,MPI_COMM_WORLD,&req[1]);
for(i=0;i < steps;i++)//重复steps次
{
//先计算需要通信的部分P[0]
P[0]++;
//启动两个非阻塞通信
MPI_Startall(2,req);
//完成非阻塞通信,非阻塞通信对象变为非活动态
MPI_Waitall(2,req,status);
//计算剩余的部分
for(j=1;j<N;j++)
P[j]++;
if(myid==0) P[0] += buf;
else if (myid==1) P[0] *= buf;
//测试输出
sleep(i+myid);
printf("进程%d里面i=%d时数组结果为: ",myid,i);
printf("(buf为:%4d )",buf);
for(j=0;j<N;j++)
printf("%4d",P[j]);
printf("\n");
}
MPI_Request_free(req);
}
int main(int argc,char *argv[])
{
int rank,size;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
Send_Recv_Init(rank);
MPI_Finalize();
return 0;
}
#include "mpi.h"
#include "stdio.h"
#define N 4
#define steps 3
/*************************************************************************************
*此函数实现:进程0里面A[i]++;A[0]=A[0]+B[0]; 进程1里面实现:B[i]++;B[0]=A[0]+B[0];
*并实现了计算与通信重叠
*************************************************************************************/
void Send_Recv_Init(int myid)
{
int i,j;
int P[N];
int buf;
int dest=(myid+1)%2;
int tag=99;
MPI_Request req[2];
MPI_Status status[2];
//初始化
for(i=0;i<N;i++)
P[i]=myid+1;
printf("进程%d里面初始化数组为: ",myid);
for(j=0;j<N;j++)
printf("%3d",P[j]);
printf("\n");
MPI_Send_init(&P,1,MPI_INT,dest,tag,MPI_COMM_WORLD,&req[0]);
MPI_Recv_init(&buf,1,MPI_INT,dest,tag,MPI_COMM_WORLD,&req[1]);
for(i=0;i < steps;i++)//重复steps次
{
//先计算需要通信的部分P[0]
P[0]++;
//启动两个非阻塞通信
MPI_Startall(2,req);
//完成非阻塞通信,非阻塞通信对象变为非活动态
MPI_Waitall(2,req,status);
//计算剩余的部分
for(j=1;j<N;j++)
P[j]++;
if(myid==0) P[0] += buf;
else if (myid==1) P[0] *= buf;
//测试输出
sleep(i+myid);
printf("进程%d里面i=%d时数组结果为: ",myid,i);
printf("(buf为:%4d )",buf);
for(j=0;j<N;j++)
printf("%4d",P[j]);
printf("\n");
}
MPI_Request_free(req);
}
int main(int argc,char *argv[])
{
int rank,size;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
Send_Recv_Init(rank);
MPI_Finalize();
return 0;
}