MPI中使用split进行通信域的分裂

MPI的小作业,刚写完,贴上。
题目和代码如下,要求使用split进行通信域的分裂:
/*

奇数进程之间和偶数进程之间各自独立地进行循环数据传递,初始值为各自的进程数,各进程都加上自己在MPI_COMM_WORLD中的进程号后传递给下一个进程,各个进程都打印自己的在MPI_COMM_WORLD中的进程号以及接收到的数据。

by East

*/ 

#include“mpi.h”

#include

#include 

int main( int argc, char *argv[] )

{

     int rank, size;

     int n_rank, n_size;

     int *data, buf; 

     MPI_Comm n_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_Comm_split(MPI_COMM_WORLD, rank%2, 0, &n_comm);

     //得到新的ranksize

     MPI_Comm_rank(n_comm, &n_rank);

     MPI_Comm_size(n_comm, &n_size);     

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

     //data数组的值为各通信域的进程数,加上自己在MPI_COMM_WORLD中的进程号

     data[rank] = n_size + rank; 

     MPI_Irecv(&buf, 1, MPI_INT, (n_size + n_rank-1)%n_size, 0, n_comm, &request);

//   MPI_Wait(&request, &status); 

     MPI_Send(&data[rank], 1, MPI_INT, (n_rank+1)%n_size, 0, n_comm);

     MPI_Wait(&request, &status); 

     printf(“[%d]号进程发送数据:%d\n”,rank, data[rank]);

     printf(“[%d]号进程收到数据:%d\n”,rank, buf);     

     MPI_Comm_free(&n_comm);