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

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

/*


奇数进程之间和偶数进程之间各自独立地进行循环数据传递,初始值为各自的进程数,各进程都加上自己在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);


MPI_Finalize();


return 0;


}