linux 进程阻塞 语句,MPI进程拓扑及非阻塞通信程序示例

题目如下,是关于MPI进程拓扑的:

请编写具有二维拓扑的MPI程序,每个程序都与其上下左右进程进行通信,请打印出它的上下左右进程的进程号和通信的内容。

代码如下,通信语句使用了非阻塞通信方式:

#include"mpi.h"

#include

#defineNUM_DIMS 2

intmain( int argc, char **argv ){

int rank,size;

int periods[NUM_DIMS] = {0,0};

int dims[NUM_DIMS] = {0,0};

int right_nbr, left_nbr;

int *data,buf=0;

int i,flag;

MPI_Comm my_comm;

MPI_Status status;

MPI_Request request;

MPI_Init(&argc, &argv);

MPI_Comm_rank( MPI_COMM_WORLD, &rank );

MPI_Comm_size(MPI_COMM_WORLD, &size);

MPI_Dims_create(size, NUM_DIMS, dims);

MPI_Cart_create(MPI_COMM_WORLD, NUM_DIMS, dims, periods, 0, &my_comm);

data = (int *)malloc( size * sizeof(int) );

//初始化data数组

for(i=0;i

data[i] = 10*i;

}

flag = NUM_DIMS;

while(--flag>=0){

//flag = 1时,横向,flag = 0时,纵向

MPI_Cart_shift(my_comm, flag, 1, &left_nbr, &right_nbr);

MPI_Isend(&data[rank], 1, MPI_INT, left_nbr, 0, MPI_COMM_WORLD, &request);

MPI_Wait(&request, &status);

MPI_Isend(&data[rank], 1, MPI_INT, right_nbr, 0, MPI_COMM_WORLD, &request);

MPI_Wait(&request, &status);

if(flag){

printf("进程[%d]发送数据数据(%d)\n",rank, data[rank]);

}

if(left_nbr!=-1){

MPI_Irecv(&buf, 1, MPI_INT, left_nbr, 0, MPI_COMM_WORLD, &request);

MPI_Wait(&request, &status);

printf("进程[%d]从%s进程[%d]接收到数据(%d)\n",rank, flag?"左边":"上边", left_nbr, buf);

}

if(right_nbr!=-1){

MPI_Irecv(&buf, 1, MPI_INT, right_nbr, 0, MPI_COMM_WORLD, &request);

MPI_Wait(&request, &status);

printf("进程[%d]从%s进程[%d]接收到数据(%d)\n",rank, flag?"右边":"下边", right_nbr, buf);

}

}

MPI_Finalize();

}

进程数为8时,程序运行结果如下:

0eb5f18cc0ce9c4b41218a40be760587.bmp0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值