root/ompi/patterns/net/netpatterns.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /*
   2  * Copyright (c) 2009-2012 Mellanox Technologies.  All rights reserved.
   3  * Copyright (c) 2009-2012 Oak Ridge National Laboratory.  All rights reserved.
   4  * Copyright (c) 2012      Los Alamos National Security, LLC.
   5  *                         All rights reserved.
   6   * Copyright (c) 2017      IBM Corporation. All rights reserved.
   7   * $COPYRIGHT$
   8  *
   9  * Additional copyrights may follow
  10  *
  11  * $HEADER$
  12  */
  13 
  14 #ifndef COMM_PATTERNS_H
  15 #define COMM_PATTERNS_H
  16 
  17 #include "ompi_config.h"
  18 
  19 #include "ompi/mca/rte/rte.h"
  20 #include "netpatterns_knomial_tree.h"
  21 
  22 BEGIN_C_DECLS
  23 
  24 int ompi_netpatterns_base_err(const char* fmt, ...);
  25 int ompi_netpatterns_register_mca_params(void);
  26 
  27 #if OPAL_ENABLE_DEBUG
  28 extern int ompi_netpatterns_base_verbose; /* disabled by default */
  29 OMPI_DECLSPEC extern int ompi_netpatterns_base_err(const char*, ...) __opal_attribute_format__(__printf__, 1, 2);
  30 #define NETPATTERNS_VERBOSE(args)                                \
  31     do {                                                         \
  32         if(ompi_netpatterns_base_verbose > 0) {           \
  33             ompi_netpatterns_base_err("[%s]%s[%s:%d:%s] ",\
  34                     ompi_process_info.nodename,                  \
  35                     OMPI_NAME_PRINT(OMPI_PROC_MY_NAME),          \
  36                     __FILE__, __LINE__, __func__);               \
  37             ompi_netpatterns_base_err args;               \
  38             ompi_netpatterns_base_err("\n");              \
  39         }                                                        \
  40     } while(0);
  41 #else
  42 #define NETPATTERNS_VERBOSE(args)
  43 #endif
  44 
  45 #define FIND_BASE(base,myid,level,k)    \
  46     do {                                \
  47         int temp = 1;                   \
  48         int jj;                         \
  49         int knt2;                       \
  50                                         \
  51         base = 0;                       \
  52         for( jj = 0; jj < level; jj++) {\
  53             temp *= k;                  \
  54         }                               \
  55         knt2 = 1;                       \
  56         while(myid >= knt2*temp){       \
  57             knt2++;                     \
  58         }                               \
  59         base = knt2*temp - temp;        \
  60     } while(0)                          \
  61 
  62 
  63 
  64 
  65 /* enum for node type */
  66 enum {
  67     ROOT_NODE,
  68     LEAF_NODE,
  69     INTERIOR_NODE
  70 };
  71 
  72 
  73 /*
  74  * N-order tree node description
  75  */
  76 struct netpatterns_tree_node_t {
  77     /* my rank within the group */
  78     int my_rank;
  79     /* my node type - root, leaf, or interior */
  80     int my_node_type;
  81     /* number of nodes in the tree */
  82     int tree_size;
  83     /* number of parents (0/1) */
  84     int n_parents;
  85     /* number of children */
  86     int n_children;
  87     /* parent rank within the group */
  88     int parent_rank;
  89     /* chidren ranks within the group */
  90     int *children_ranks;
  91 };
  92 typedef struct netpatterns_tree_node_t netpatterns_tree_node_t;
  93 
  94 struct netpatterns_k_exchange_node_t;
  95 /*
  96  * N-order + knominal tree node description
  97  */
  98 struct netpatterns_narray_knomial_tree_node_t {
  99     /* my rank within the group */
 100     int my_rank;
 101     /* my node type - root, leaf, or interior */
 102     int my_node_type;
 103     /* number of nodes in the tree */
 104     int tree_size;
 105     /* number of parents (0/1) */
 106     int n_parents;
 107     /* number of children */
 108     int n_children;
 109     /* parent rank within the group */
 110     int parent_rank;
 111     /* chidren ranks within the group */
 112     int *children_ranks;
 113     /* Total number of ranks on this specific level */
 114     int level_size;
 115     /* Rank on this node inside of level */
 116     int rank_on_level;
 117     /* Knomial recursive gather information */
 118     struct netpatterns_k_exchange_node_t k_node;
 119 };
 120 typedef struct netpatterns_narray_knomial_tree_node_t
 121 netpatterns_narray_knomial_tree_node_t;
 122 
 123 
 124 /* Init code for common_netpatterns */
 125 OMPI_DECLSPEC int ompi_netpatterns_init(void);
 126 
 127 /* setup an n-array tree */
 128 OMPI_DECLSPEC int ompi_netpatterns_setup_narray_tree(int tree_order, int my_rank, int num_nodes,
 129         netpatterns_tree_node_t *my_node);
 130 /* setup an n-array tree with k-nomial levels */
 131 OMPI_DECLSPEC int ompi_netpatterns_setup_narray_knomial_tree( int tree_order, int my_rank, int num_nodes,
 132         netpatterns_narray_knomial_tree_node_t *my_node);
 133 /* cleanup an n-array tree setup by the above function */
 134 OMPI_DECLSPEC void ompi_netpatterns_cleanup_narray_knomial_tree (netpatterns_narray_knomial_tree_node_t *my_node);
 135 
 136 /* setup an multi-nomial tree - for each node in the tree
 137  *  this returns it's parent, and it's children
 138  */
 139 OMPI_DECLSPEC int ompi_netpatterns_setup_multinomial_tree(int tree_order, int num_nodes,
 140         netpatterns_tree_node_t *tree_nodes);
 141 
 142 OMPI_DECLSPEC int ompi_netpatterns_setup_narray_tree_contigous_ranks(int tree_order,
 143         int num_nodes, netpatterns_tree_node_t **tree_nodes);
 144 
 145 /* calculate the nearest power of radix that is equal to or greater
 146  * than size, with the specified radix.  The resulting tree is of
 147  * depth n_lvls.
 148  */
 149 OMPI_DECLSPEC int ompi_roundup_to_power_radix( int radix, int size, int *n_lvls );
 150 
 151 END_C_DECLS
 152 
 153 #endif /* COMM_PATTERNS_H */

/* [<][>][^][v][top][bottom][index][help] */