a31bc57849
This commit was SVN r28035.
151 строка
4.7 KiB
C
151 строка
4.7 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);
|
|
|
|
/* 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 */
|