1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  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; 
  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 
  66 enum {
  67     ROOT_NODE,
  68     LEAF_NODE,
  69     INTERIOR_NODE
  70 };
  71 
  72 
  73 
  74 
  75 
  76 struct netpatterns_tree_node_t {
  77     
  78     int my_rank;
  79     
  80     int my_node_type;
  81     
  82     int tree_size;
  83     
  84     int n_parents;
  85     
  86     int n_children;
  87     
  88     int parent_rank;
  89     
  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 
  97 
  98 struct netpatterns_narray_knomial_tree_node_t {
  99     
 100     int my_rank;
 101     
 102     int my_node_type;
 103     
 104     int tree_size;
 105     
 106     int n_parents;
 107     
 108     int n_children;
 109     
 110     int parent_rank;
 111     
 112     int *children_ranks;
 113     
 114     int level_size;
 115     
 116     int rank_on_level;
 117     
 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 
 125 OMPI_DECLSPEC int ompi_netpatterns_init(void);
 126 
 127 
 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 
 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 
 134 OMPI_DECLSPEC void ompi_netpatterns_cleanup_narray_knomial_tree (netpatterns_narray_knomial_tree_node_t *my_node);
 135 
 136 
 137 
 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 
 146 
 147 
 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