首页 / 操作系统 / Linux / MPI中使用split进行通信域的分裂
MPI的小作业,刚写完,贴上。
题目和代码如下,要求使用split进行通信域的分裂:/*奇数进程之间和偶数进程之间各自独立地进行循环数据传递,初始值为各自的进程数,各进程都加上自己在MPI_COMM_WORLD中的进程号后传递给下一个进程,各个进程都打印自己的在MPI_COMM_WORLD中的进程号以及接收到的数据。by East*/ #include"mpi.h"#include<stdio.h>#include<malloc.h> 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
",rank, data[rank]); printf("[%d]号进程收到数据:%d
",rank, buf); MPI_Comm_free(&n_comm); MPI_Finalize(); return 0;}