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