首页 / 操作系统 / Linux / MPI进程拓扑及非阻塞通信程序示例
题目如下,是关于MPI进程拓扑的:请编写具有二维拓扑的MPI程序,每个程序都与其上下左右进程进行通信,请打印出它的上下左右进程的进程号和通信的内容。 代码如下,通信语句使用了非阻塞通信方式:#include"mpi.h"#include<stdio.h>#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<size;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)
",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)
",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)
",rank, flag?"右边":"下边", right_nbr, buf); } } MPI_Finalize();} 进程数为8时,程序运行结果如下: