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

📄 topoutil.c

📁 mpi并行计算的c++代码 可用vc或gcc编译通过 可以用来搭建并行计算试验环境
💻 C
字号:
/* -*- Mode: C; c-basic-offset:4 ; -*- *//* * *  (C) 2001 by Argonne National Laboratory. *      See COPYRIGHT in top-level directory. */#include "mpiimpl.h"#include "topo.h"/* Keyval for topology information */static int MPIR_Topology_keyval = MPI_KEYVAL_INVALID;  /* Local functions */static int MPIR_Topology_copy_fn ( MPI_Comm, int, void *, void *, void *, 				   int * );static int MPIR_Topology_delete_fn ( MPI_Comm, int, void *, void * );static int MPIR_Topology_finalize ( void * );/*  Return a poiner to the topology structure on a communicator.  Returns null if no topology structure is defined */MPIR_Topology *MPIR_Topology_get( MPID_Comm *comm_ptr ){    MPIR_Topology *topo_ptr;    int flag;    if (MPIR_Topology_keyval == MPI_KEYVAL_INVALID) {	return 0;    }    MPIR_Nest_incr();    (void)NMPI_Comm_get_attr(comm_ptr->handle, MPIR_Topology_keyval,			     &topo_ptr, &flag );    MPIR_Nest_decr();    if (flag) return topo_ptr;    return 0;}int MPIR_Topology_put( MPID_Comm *comm_ptr, MPIR_Topology *topo_ptr ){    int mpi_errno;    if (MPIR_Topology_keyval == MPI_KEYVAL_INVALID) {	/* Create a new keyval */	/* FIXME - thread safe code needs a thread lock here, followed	   by another test on the keyval to see if a different thread	   got there first */	MPIR_Nest_incr();	mpi_errno = NMPI_Comm_create_keyval( MPIR_Topology_copy_fn, 					     MPIR_Topology_delete_fn,					     &MPIR_Topology_keyval, 0 );	MPIR_Nest_decr();	/* Register the finalize handler */	if (mpi_errno) return mpi_errno;	MPIR_Add_finalize( MPIR_Topology_finalize, (void*)0, 9 );    }    MPIR_Nest_incr();    mpi_errno = NMPI_Comm_set_attr(comm_ptr->handle, MPIR_Topology_keyval, 				   topo_ptr );    MPIR_Nest_decr();    return mpi_errno;}/* Ignore p *//* begin:nested */static int MPIR_Topology_finalize( void *p ){    MPIR_Nest_incr();    MPIU_UNREFERENCED_ARG(p);    if (MPIR_Topology_keyval != MPI_KEYVAL_INVALID) {	/* Just in case */	NMPI_Comm_free_keyval( &MPIR_Topology_keyval );    }    MPIR_Nest_decr();    return 0;}/* end:nested */static int *MPIR_Copy_array( int n, const int a[], int *err ){    int *new_p = (int *)MPIU_Malloc( n * sizeof(int) );    int i;        /* --BEGIN ERROR HANDLING-- */    if (!new_p) {	*err = MPI_ERR_OTHER;	return 0;    }    /* --END ERROR HANDLING-- */    for (i=0; i<n; i++) {	new_p[i] = a[i];    }    return new_p;}/* The keyval copy and delete functions must handle copying and deleting    the assoicated topology structures       We can reduce the number of allocations by making a single allocation   of enough integers for all fields (including the ones in the structure)   and freeing the single object later.*/static int MPIR_Topology_copy_fn ( MPI_Comm comm, int keyval, void *extra_data,				   void *attr_in, void *attr_out, 				   int *flag ){    MPIR_Topology *old_topology = (MPIR_Topology *)attr_in;    MPIR_Topology *copy_topology = (MPIR_Topology *)MPIU_Malloc( sizeof( MPIR_Topology) );    int mpi_errno = 0;    MPIU_UNREFERENCED_ARG(comm);    MPIU_UNREFERENCED_ARG(keyval);    MPIU_UNREFERENCED_ARG(extra_data);    /* --BEGIN ERROR HANDLING-- */    if (!copy_topology) {	return MPI_ERR_OTHER;    }    /* --END ERROR HANDLING-- */    copy_topology->kind = old_topology->kind;    if (old_topology->kind == MPI_CART) {	int ndims = old_topology->topo.cart.ndims;	copy_topology->topo.cart.nnodes = old_topology->topo.cart.nnodes;	copy_topology->topo.cart.ndims  = ndims;	copy_topology->topo.cart.dims = MPIR_Copy_array( ndims,				     old_topology->topo.cart.dims, 				     &mpi_errno );	copy_topology->topo.cart.periodic = MPIR_Copy_array( ndims,			       old_topology->topo.cart.periodic, &mpi_errno );	copy_topology->topo.cart.position = MPIR_Copy_array( ndims, 			       old_topology->topo.cart.position, &mpi_errno );    }    else if (old_topology->kind == MPI_GRAPH) {	int nnodes = old_topology->topo.graph.nnodes;	copy_topology->topo.graph.nnodes = nnodes;	copy_topology->topo.graph.nedges = old_topology->topo.graph.nedges;	copy_topology->topo.graph.index = MPIR_Copy_array( 				 old_topology->topo.graph.index[nnodes-1],				 old_topology->topo.graph.index, &mpi_errno );	copy_topology->topo.graph.edges = MPIR_Copy_array( 				 old_topology->topo.graph.nedges, 				 old_topology->topo.graph.edges, &mpi_errno );    }    /* --BEGIN ERROR HANDLING-- */    else {	/* Unknown topology */	return MPI_ERR_TOPOLOGY;    }    /* --END ERROR HANDLING-- */    *(void **)attr_out = (void *)copy_topology;    *flag = 1;    /* Return mpi_errno in case one of the copy array functions failed */    return mpi_errno;}static int MPIR_Topology_delete_fn ( MPI_Comm comm, int keyval, 				     void *attr_val, void *extra_data ){    MPIR_Topology *topology = (MPIR_Topology *)attr_val;    MPIU_UNREFERENCED_ARG(comm);    MPIU_UNREFERENCED_ARG(keyval);    MPIU_UNREFERENCED_ARG(extra_data);    /* FIXME - free the attribute data structure */        if (topology->kind == MPI_CART) {	MPIU_Free( topology->topo.cart.dims );	MPIU_Free( topology->topo.cart.periodic );	MPIU_Free( topology->topo.cart.position );	MPIU_Free( topology );    }    else if (topology->kind == MPI_GRAPH) {	MPIU_Free( topology->topo.graph.index );	MPIU_Free( topology->topo.graph.edges );	MPIU_Free( topology );    }    /* --BEGIN ERROR HANDLING-- */    else {	return MPI_ERR_TOPOLOGY;    }    /* --END ERROR HANDLING-- */    return MPI_SUCCESS;}

⌨️ 快捷键说明

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