MPI中使用split进行通信域的分裂
题目和代码如下,要求使用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);
//得到新的rank和size
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);