📄 gcomm.c
字号:
/* This file generates a few communicators for use in the test suite THIS CODE IS FROM mpich/tsuite AND SHOULD BE CHANGED THERE ONLY */#include "mpi.h"#include "gcomm.h"void MakeComms( comms, maxn, n, make_intercomm )MPI_Comm *comms;int *n, maxn, make_intercomm;{int cnt = 0;int rank, size;int dims[2];int periods[2], range[1][3];MPI_Group group, newgroup;MPI_Comm_rank( MPI_COMM_WORLD, &rank );MPI_Comm_size( MPI_COMM_WORLD, &size );comms[cnt++] = MPI_COMM_WORLD;if (cnt == maxn) {*n = cnt; return; }/* Construct a communicator with the ranks reversed */MPI_Comm_group( MPI_COMM_WORLD, &group );range[0][0] = size-1;range[0][1] = 0;range[0][2] = -1;MPI_Group_range_incl( group, 1, range, &newgroup );MPI_Comm_create( MPI_COMM_WORLD, newgroup, &comms[cnt] );cnt++;MPI_Group_free( &group );MPI_Group_free( &newgroup );if (cnt == maxn) {*n = cnt; return; }if (size > 3) { /* Divide into odd and even processes */ MPI_Comm_split( MPI_COMM_WORLD, rank & 0x1, rank, comms + cnt ); cnt ++; /* Use the cartesian constructors */ dims[0] = 0; dims[1] = 0; MPI_Dims_create( size, 2, dims ); periods[0] = 0; periods[1] = 0; MPI_Cart_create( MPI_COMM_WORLD, 2, dims, periods, 0, comms + cnt ); cnt ++; if (cnt == maxn) {*n = cnt; return; } /* Create an intercommunicator (point-to-point operations only) Note that in this case, codes need to use MPI_Comm_remote_size to (added to MPI_Comm_size) to get the size of the full group */ if (make_intercomm) { /* The remote_leader is rank 1 in MPI_COMM_WORLD if we are even and 0 if we are odd (the remote_leader rank is relative to the peer communicator) */ MPI_Intercomm_create( comms[2], 0, MPI_COMM_WORLD, !(rank&0x1), 37, comms + cnt ); cnt ++; if (cnt == maxn) {*n = cnt; return; } } }*n = cnt;}void FreeComms( comms, n )MPI_Comm *comms;int n;{int i;for (i=1; i<n; i++) { if (comms[i] != MPI_COMM_NULL) MPI_Comm_free( comms + i ); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -