1
1
openmpi/ompi/patterns/net/netpatterns.h
2015-06-23 20:59:57 -07:00

153 строки
4.8 KiB
C

/*
* Copyright (c) 2009-2012 Mellanox Technologies. All rights reserved.
* Copyright (c) 2009-2012 Oak Ridge National Laboratory. All rights reserved.
* Copyright (c) 2012 Los Alamos National Security, LLC.
* All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#ifndef COMM_PATTERNS_H
#define COMM_PATTERNS_H
#include "ompi_config.h"
#include "ompi/mca/rte/rte.h"
#include "netpatterns_knomial_tree.h"
BEGIN_C_DECLS
int netpatterns_base_err(const char* fmt, ...);
int netpatterns_register_mca_params(void);
#if OPAL_ENABLE_DEBUG
extern int netpatterns_base_verbose; /* disabled by default */
OMPI_DECLSPEC extern int netpatterns_base_err(const char*, ...) __opal_attribute_format__(__printf__, 1, 2);
#define NETPATTERNS_VERBOSE(args) \
do { \
if(netpatterns_base_verbose > 0) { \
netpatterns_base_err("[%s]%s[%s:%d:%s] ",\
ompi_process_info.nodename, \
OMPI_NAME_PRINT(OMPI_PROC_MY_NAME), \
__FILE__, __LINE__, __func__); \
netpatterns_base_err args; \
netpatterns_base_err("\n"); \
} \
} while(0);
#else
#define NETPATTERNS_VERBOSE(args)
#endif
#define FIND_BASE(base,myid,level,k) \
do { \
int temp = 1; \
int jj; \
int knt2; \
\
base = 0; \
for( jj = 0; jj < level; jj++) {\
temp *= k; \
} \
knt2 = 1; \
while(myid >= knt2*temp){ \
knt2++; \
} \
base = knt2*temp - temp; \
} while(0) \
/* enum for node type */
enum {
ROOT_NODE,
LEAF_NODE,
INTERIOR_NODE
};
/*
* N-order tree node description
*/
struct netpatterns_tree_node_t {
/* my rank within the group */
int my_rank;
/* my node type - root, leaf, or interior */
int my_node_type;
/* number of nodes in the tree */
int tree_size;
/* number of parents (0/1) */
int n_parents;
/* number of children */
int n_children;
/* parent rank within the group */
int parent_rank;
/* chidren ranks within the group */
int *children_ranks;
};
typedef struct netpatterns_tree_node_t netpatterns_tree_node_t;
struct netpatterns_k_exchange_node_t;
/*
* N-order + knominal tree node description
*/
struct netpatterns_narray_knomial_tree_node_t {
/* my rank within the group */
int my_rank;
/* my node type - root, leaf, or interior */
int my_node_type;
/* number of nodes in the tree */
int tree_size;
/* number of parents (0/1) */
int n_parents;
/* number of children */
int n_children;
/* parent rank within the group */
int parent_rank;
/* chidren ranks within the group */
int *children_ranks;
/* Total number of ranks on this specific level */
int level_size;
/* Rank on this node inside of level */
int rank_on_level;
/* Knomial recursive gather information */
struct netpatterns_k_exchange_node_t k_node;
};
typedef struct netpatterns_narray_knomial_tree_node_t
netpatterns_narray_knomial_tree_node_t;
/* Init code for common_netpatterns */
OMPI_DECLSPEC int netpatterns_init(void);
/* setup an n-array tree */
OMPI_DECLSPEC int netpatterns_setup_narray_tree(int tree_order, int my_rank, int num_nodes,
netpatterns_tree_node_t *my_node);
/* setup an n-array tree with k-nomial levels */
OMPI_DECLSPEC int netpatterns_setup_narray_knomial_tree( int tree_order, int my_rank, int num_nodes,
netpatterns_narray_knomial_tree_node_t *my_node);
/* cleanup an n-array tree setup by the above function */
OMPI_DECLSPEC void netpatterns_cleanup_narray_knomial_tree (netpatterns_narray_knomial_tree_node_t *my_node);
/* setup an multi-nomial tree - for each node in the tree
* this returns it's parent, and it's children
*/
OMPI_DECLSPEC int netpatterns_setup_multinomial_tree(int tree_order, int num_nodes,
netpatterns_tree_node_t *tree_nodes);
OMPI_DECLSPEC int netpatterns_setup_narray_tree_contigous_ranks(int tree_order,
int num_nodes, netpatterns_tree_node_t **tree_nodes);
/* calculate the nearest power of radix that is equal to or greater
* than size, with the specified radix. The resulting tree is of
* depth n_lvls.
*/
OMPI_DECLSPEC int roundup_to_power_radix( int radix, int size, int *n_lvls );
END_C_DECLS
#endif /* COMM_PATTERNS_H */