⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cart.c

📁 MPICH是MPI的重要研究,提供了一系列的接口函数,为并行计算的实现提供了编程环境.
💻 C
字号:
#include "mpi.h"#include <stdio.h>#include "test.h"#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 = 1;    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 );    /* 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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -