MPI进程拓扑及非阻塞通信程序示例

2014-11-24 09:53:59 · 作者: · 浏览: 1

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


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


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



#include"mpi.h"


#include


#define NUM_DIMS 2




int main( 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时,程序运行结果如下:


MPI