cartorder.c

来自「MPICH是MPI的重要研究,提供了一系列的接口函数,为并行计算的实现提供了编程」· C语言 代码 · 共 149 行

C
149
字号
#include "mpi.h"#include <stdio.h>#include "test.h"/* This test makes sure that the ordering if reorder is FALSE is   as specified in 6.2, virtual topologies    At the same time, it duplicates the tests in cart.c, but   with reorder = 0.*/#define NUM_DIMS 2int main( int argc, char **argv ){    int              rank, size, i;    int              errors=0;    int              dims[NUM_DIMS];    int              periods[NUM_DIMS];    int              coords[NUM_DIMS];    int              new_coords[NUM_DIMS];    int              reorder = 0;    MPI_Comm         comm_temp, comm_cart, new_comm;    int              topo_status;    int              ndims;    int              new_rank;    int              remain_dims[NUM_DIMS];    int              newnewrank;    MPI_Init( &argc, &argv );    MPI_Comm_rank( MPI_COMM_WORLD, &rank );    MPI_Comm_size( MPI_COMM_WORLD, &size );    /* Clear dims array and get dims for topology */    for(i=0;i<NUM_DIMS;i++) { dims[i] = 0; periods[i] = 0; }    MPI_Dims_create ( size, NUM_DIMS, dims );    /* Make a new communicator with a topology */    MPI_Cart_create ( MPI_COMM_WORLD, 2, dims, periods, reorder, &comm_temp );    MPI_Comm_dup ( comm_temp, &comm_cart );    /* Determine the status of the new communicator */    MPI_Topo_test ( comm_cart, &topo_status );    if (topo_status != MPI_CART) {	printf( "topo_status of duped comm is not MPI_CART\n" );	errors++;    }    /* How many dims do we have? */    MPI_Cartdim_get( comm_cart, &ndims );    if ( ndims != NUM_DIMS ) {	printf( "Number of dims of duped comm (%d) should be %d\n", 		ndims, NUM_DIMS );	errors++;    }    /* Get the topology, does it agree with what we put in? */    for(i=0;i<NUM_DIMS;i++) { dims[i] = 0; periods[i] = 0; }    MPI_Cart_get ( comm_cart, NUM_DIMS, dims, periods, coords );    /* Check that the coordinates are correct */#if NUM_DIMS == 2    if (rank != coords[1] + coords[0] * dims[1]) {	errors++;	fprintf( stderr, "Did not get expected coordinate (row major required by MPI standard 6.2)\n" );    }#endif    /* Does the mapping from coords to rank work? */    MPI_Cart_rank ( comm_cart, coords, &new_rank );    if ( new_rank != rank ) {	printf( "New rank of duped comm (%d) != old rank (%d)\n", 		new_rank, rank );	errors++;    }    /* Does the mapping from rank to coords work */    MPI_Cart_coords ( comm_cart, rank, NUM_DIMS, new_coords );    for (i=0;i<NUM_DIMS;i++) 	if ( coords[i] != new_coords[i] ) {	    printf( "Old coords[%d] of duped comm (%d) != new_coords (%d)\n", 		    i, coords[i], new_coords[i] );	    errors++;	}    /* Let's shift in each dimension and see how it works!   */    /* Because it's late and I'm tired, I'm not making this  */    /* automatically test itself.                            */    for (i=0;i<NUM_DIMS;i++) {      int source, dest;      MPI_Cart_shift(comm_cart, i, 1, &source, &dest);#ifdef VERBOSE            printf ("[%d] Shifting %d in the %d dimension\n",rank,1,i);      printf ("[%d]    source = %d  dest = %d\n",rank,source,dest); #endif    }    /* Subdivide */    remain_dims[0] = 0;     for (i=1; i<NUM_DIMS; i++) remain_dims[i] = 1;    MPI_Cart_sub ( comm_cart, remain_dims, &new_comm );    /* Determine the status of the new communicator */    MPI_Topo_test ( new_comm, &topo_status );    if (topo_status != MPI_CART) {	printf( "topo_status of cartsub comm is not MPI_CART\n" );	errors++;    }    /* How many dims do we have? */    MPI_Cartdim_get( new_comm, &ndims );    if ( ndims != NUM_DIMS-1 ) {	printf( "Number of dims of cartsub comm (%d) should be %d\n", 		ndims, NUM_DIMS-1 );	errors++;    }    /* Get the topology, does it agree with what we put in? */    for(i=0;i<NUM_DIMS-1;i++) { dims[i] = 0; periods[i] = 0; }    MPI_Cart_get ( new_comm, ndims, dims, periods, coords );        /* Does the mapping from coords to rank work? */    MPI_Comm_rank ( new_comm, &newnewrank );    MPI_Cart_rank ( new_comm, coords, &new_rank );    if ( new_rank != newnewrank ) {	printf( "New rank of cartsub comm (%d) != old rank (%d)\n", 		new_rank, newnewrank );	errors++;    }    /* Does the mapping from rank to coords work */    MPI_Cart_coords ( new_comm, new_rank, NUM_DIMS -1, new_coords );    for (i=0;i<NUM_DIMS-1;i++) 	if ( coords[i] != new_coords[i] ) {	    printf( "Old coords[%d] of cartsub comm (%d) != new_coords (%d)\n", 		    i, coords[i], new_coords[i] );	    errors++;	}    /* We're at the end */    MPI_Comm_free( &new_comm );    MPI_Comm_free( &comm_temp );    MPI_Comm_free( &comm_cart );    Test_Waitforall( );    if (errors) printf( "[%d] done with %d ERRORS!\n", rank,errors );    MPI_Finalize();    return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?