MPI_Send和MPI_Recv影响下程序的执行顺序是怎样的?



#include<stdio.h>
#include<stdlib.h>
#include"mpi.h"
#define N 9
#define M 20
int A[M][N];
int B[N];
int BB[N];
int C[M];
int buf[N];
int bufr[N];
int bufc;
int tagB=100;
int main(int argc, char **argv)
{
int id;
int size;
MPI_Status status;
MPI_Init(&argc,&argv);
//MPI_Status status;
MPI_Comm_rank(MPI_COMM_WORLD,&id);
MPI_Comm_size(MPI_COMM_WORLD,&size);
if(0==id){
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
A[j][i]=i+j;
C[j]=0;
}
B[i]=i;
}

//MPI_Bcast(B,N,MPI_INT,0,MPI_COMM_WORLD);
//hand out B to all procs except 0

printf("test    1,id=%d\n",id);
for(int k=1;k<size;k++)
{
MPI_Send(B,N,MPI_INT,k,tagB,MPI_COMM_WORLD);

}
printf("test    2,id=%d\n",id);
// hand out A to all processors except 0
for(int k=1;k<size;k++){
for(int j=M*(k-1)/(size-1);j<M*k/(size-1);j++){
for(int i=0;i<N;i++){
buf[i]=A[j][i];
}
MPI_Send(buf,N,MPI_INT,k,j,MPI_COMM_WORLD);
}
}
printf("test    3,id=%d\n",id);
}
else{
// receive B
printf("test    4,id=%d\n",id);
MPI_Recv(BB,N,MPI_INT,0,tagB,MPI_COMM_WORLD,&status);
//receive A
printf("test    5,id=%d\n",id);
for(int j=0;j<M;j++){
MPI_Recv(bufr,N,MPI_INT,0,j,MPI_COMM_WORLD,&status);
for(int i=0;i<N;i++)
{
bufc+=bufr[i]*B[i];
}
//MPI_Send(&bufc,1,MPI_INT,0,j,MPI_COMM_WORLD);
printf("%d %d",j,bufc);
}
}
printf("test    6,id=%d\n",id);
MPI_Finalize();
return 0;
}

image

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值