This source file includes following definitions.
- ompi_coll_tuned_mk_alg_rules
- ompi_coll_tuned_mk_com_rules
- ompi_coll_tuned_mk_msg_rules
- ompi_coll_tuned_dump_msg_rule
- ompi_coll_tuned_dump_com_rule
- ompi_coll_tuned_dump_alg_rule
- ompi_coll_tuned_dump_all_rules
- ompi_coll_tuned_free_msg_rules_in_com_rule
- ompi_coll_tuned_free_coms_in_alg_rule
- ompi_coll_tuned_free_all_rules
- ompi_coll_tuned_get_com_rule_ptr
- ompi_coll_tuned_get_target_method_params
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 #include "ompi_config.h"
23
24 #include "mpi.h"
25 #include "ompi/mca/mca.h"
26 #include "ompi/constants.h"
27 #include "coll_tuned.h"
28
29
30 #include "ompi/mca/coll/base/coll_base_topo.h"
31
32
33 #include "coll_tuned_dynamic_rules.h"
34
35 #include <stdlib.h>
36 #include <stdio.h>
37
38 #include "ompi/mca/coll/base/coll_base_util.h"
39
40
41 ompi_coll_alg_rule_t* ompi_coll_tuned_mk_alg_rules (int n_alg)
42 {
43 int i;
44 ompi_coll_alg_rule_t* alg_rules;
45
46 alg_rules = (ompi_coll_alg_rule_t *) calloc (n_alg, sizeof (ompi_coll_alg_rule_t));
47 if (!alg_rules) return (alg_rules);
48
49
50 for (i=0;i<n_alg;i++) {
51 alg_rules[i].alg_rule_id = i;
52 }
53 return (alg_rules);
54 }
55
56
57 ompi_coll_com_rule_t* ompi_coll_tuned_mk_com_rules (int n_com_rules, int alg_rule_id)
58 {
59 int i;
60 ompi_coll_com_rule_t * com_rules;
61
62 com_rules = (ompi_coll_com_rule_t *) calloc (n_com_rules, sizeof (ompi_coll_com_rule_t));
63 if (!com_rules) return (com_rules);
64
65 for (i=0;i<n_com_rules;i++) {
66 com_rules[i].mpi_comsize = 0;
67 com_rules[i].alg_rule_id = alg_rule_id;
68 com_rules[i].com_rule_id = i;
69 com_rules[i].n_msg_sizes = 0;
70 com_rules[i].msg_rules = (ompi_coll_msg_rule_t *) NULL;
71 }
72 return (com_rules);
73 }
74
75
76 ompi_coll_msg_rule_t* ompi_coll_tuned_mk_msg_rules (int n_msg_rules, int alg_rule_id, int com_rule_id, int mpi_comsize)
77 {
78 int i;
79 ompi_coll_msg_rule_t *msg_rules;
80
81 msg_rules = (ompi_coll_msg_rule_t *) calloc (n_msg_rules, sizeof (ompi_coll_msg_rule_t));
82 if (!msg_rules) return (msg_rules);
83
84 for( i = 0; i < n_msg_rules; i++ ) {
85 msg_rules[i].mpi_comsize = mpi_comsize;
86 msg_rules[i].alg_rule_id = alg_rule_id;
87 msg_rules[i].com_rule_id = com_rule_id;
88 msg_rules[i].msg_rule_id = i;
89 msg_rules[i].msg_size = 0;
90 msg_rules[i].result_alg = 0;
91 msg_rules[i].result_topo_faninout = 0;
92 msg_rules[i].result_segsize = 0;
93 msg_rules[i].result_max_requests = 0;
94 }
95 return (msg_rules);
96 }
97
98
99
100
101
102
103 int ompi_coll_tuned_dump_msg_rule (ompi_coll_msg_rule_t* msg_p)
104 {
105 if (!msg_p) {
106 OPAL_OUTPUT((ompi_coll_tuned_stream,"Message rule was a NULL ptr?!\n"));
107 return (-1);
108 }
109
110 OPAL_OUTPUT((ompi_coll_tuned_stream,"alg_id %3d\tcom_id %3d\tcom_size %3d\tmsg_id %3d\t", msg_p->alg_rule_id,
111 msg_p->com_rule_id, msg_p->mpi_comsize, msg_p->msg_rule_id));
112
113 OPAL_OUTPUT((ompi_coll_tuned_stream,"msg_size %10lu -> algorithm %2d\ttopo in/out %2d\tsegsize %5ld\tmax_requests %4d\n",
114 msg_p->msg_size, msg_p->result_alg, msg_p->result_topo_faninout, msg_p->result_segsize,
115 msg_p->result_max_requests));
116
117 return (0);
118 }
119
120
121 int ompi_coll_tuned_dump_com_rule (ompi_coll_com_rule_t* com_p)
122 {
123 int i;
124
125 if (!com_p) {
126 OPAL_OUTPUT((ompi_coll_tuned_stream,"Com rule was a NULL ptr?!\n"));
127 return (-1);
128 }
129
130 OPAL_OUTPUT((ompi_coll_tuned_stream, "alg_id %3d\tcom_id %3d\tcom_size %3d\t", com_p->alg_rule_id, com_p->com_rule_id, com_p->mpi_comsize));
131
132 if (!com_p->n_msg_sizes) {
133 OPAL_OUTPUT((ompi_coll_tuned_stream,"no msgsizes defined\n"));
134 return (0);
135 }
136
137 OPAL_OUTPUT((ompi_coll_tuned_stream,"number of message sizes %3d\n", com_p->n_msg_sizes));
138
139 for (i=0;i<com_p->n_msg_sizes;i++) {
140 ompi_coll_tuned_dump_msg_rule (&(com_p->msg_rules[i]));
141 }
142
143 return (0);
144 }
145
146
147 int ompi_coll_tuned_dump_alg_rule (ompi_coll_alg_rule_t* alg_p)
148 {
149 int i;
150
151 if (!alg_p) {
152 OPAL_OUTPUT((ompi_coll_tuned_stream,"Algorithm rule was a NULL ptr?!\n"));
153 return (-1);
154 }
155
156 OPAL_OUTPUT((ompi_coll_tuned_stream,"alg_id %3d\t", alg_p->alg_rule_id));
157
158 if (!alg_p->n_com_sizes) {
159 OPAL_OUTPUT((ompi_coll_tuned_stream,"no coms defined\n"));
160 return (0);
161 }
162
163 OPAL_OUTPUT((ompi_coll_tuned_stream,"number of com sizes %3d\n", alg_p->n_com_sizes));
164
165 for (i=0;i<alg_p->n_com_sizes;i++) {
166 ompi_coll_tuned_dump_com_rule (&(alg_p->com_rules[i]));
167 }
168
169 return (0);
170 }
171
172
173 int ompi_coll_tuned_dump_all_rules (ompi_coll_alg_rule_t* alg_p, int n_rules)
174 {
175 int i;
176
177 if (!alg_p) {
178 OPAL_OUTPUT((ompi_coll_tuned_stream,"Algorithm rule was a NULL ptr?!\n"));
179 return (-1);
180 }
181
182 OPAL_OUTPUT((ompi_coll_tuned_stream,"Number of algorithm rules %3d\n", n_rules));
183
184 for (i=0;i<n_rules;i++) {
185 ompi_coll_tuned_dump_alg_rule (&(alg_p[i]));
186 }
187
188 return (0);
189 }
190
191
192
193
194
195
196 int ompi_coll_tuned_free_msg_rules_in_com_rule (ompi_coll_com_rule_t* com_p)
197 {
198 int rc=0;
199 ompi_coll_msg_rule_t* msg_p;
200
201 if (!com_p) {
202 OPAL_OUTPUT((ompi_coll_tuned_stream,"attempt to free NULL com_rule ptr\n"));
203 return (-1);
204 }
205
206 if (com_p->n_msg_sizes) {
207 msg_p = com_p->msg_rules;
208
209 if (!msg_p) {
210 OPAL_OUTPUT((ompi_coll_tuned_stream,"attempt to free NULL msg_rules when msg count was %d\n", com_p->n_msg_sizes));
211 rc = -1;
212 }
213 else {
214
215 free (com_p->msg_rules);
216 com_p->msg_rules = (ompi_coll_msg_rule_t*) NULL;
217 }
218
219 }
220
221 return (rc);
222 }
223
224
225 int ompi_coll_tuned_free_coms_in_alg_rule (ompi_coll_alg_rule_t* alg_p)
226 {
227 int rc=0;
228 int i;
229
230 ompi_coll_com_rule_t* com_p;
231
232 if (!alg_p) {
233 OPAL_OUTPUT((ompi_coll_tuned_stream,"attempt to free NULL alg_rule ptr\n"));
234 return (-1);
235 }
236
237 if (alg_p->n_com_sizes) {
238 com_p = alg_p->com_rules;
239
240 if (!com_p) {
241 OPAL_OUTPUT((ompi_coll_tuned_stream,"attempt to free NULL com_rules when com count was %d\n", alg_p->n_com_sizes));
242 } else {
243
244 for( i = 0; i < alg_p->n_com_sizes; i++ ) {
245 com_p = &(alg_p->com_rules[i]);
246 ompi_coll_tuned_free_msg_rules_in_com_rule (com_p);
247 }
248
249 free (alg_p->com_rules);
250 alg_p->com_rules = (ompi_coll_com_rule_t*) NULL;
251 }
252
253 }
254
255 return (rc);
256 }
257
258
259 int ompi_coll_tuned_free_all_rules (ompi_coll_alg_rule_t* alg_p, int n_algs)
260 {
261 int i;
262 int rc = 0;
263
264 for( i = 0; i < n_algs; i++ ) {
265 rc += ompi_coll_tuned_free_coms_in_alg_rule (&(alg_p[i]));
266 }
267
268 free (alg_p);
269
270 return (rc);
271 }
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289 ompi_coll_com_rule_t* ompi_coll_tuned_get_com_rule_ptr (ompi_coll_alg_rule_t* rules, int alg_id, int mpi_comsize)
290 {
291 ompi_coll_alg_rule_t* alg_p = (ompi_coll_alg_rule_t*) NULL;
292 ompi_coll_com_rule_t* com_p = (ompi_coll_com_rule_t*) NULL;
293 ompi_coll_com_rule_t* best_com_p = (ompi_coll_com_rule_t*) NULL;
294 int i;
295
296 if (!rules) {
297 return ((ompi_coll_com_rule_t*)NULL);
298 }
299
300 alg_p = &(rules[alg_id]);
301
302 if (!alg_p->n_com_sizes) {
303 return ((ompi_coll_com_rule_t*)NULL);
304 }
305
306
307
308
309 best_com_p = com_p = alg_p->com_rules;
310 i = 0;
311
312 while( i < alg_p->n_com_sizes ) {
313 if (com_p->mpi_comsize > mpi_comsize) {
314 break;
315 }
316 best_com_p = com_p;
317
318 com_p++;
319 i++;
320 }
321
322 OPAL_OUTPUT((ompi_coll_tuned_stream,"Selected the following com rule id %d\n", best_com_p->com_rule_id));
323 ompi_coll_tuned_dump_com_rule (best_com_p);
324
325 return (best_com_p);
326 }
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343 int ompi_coll_tuned_get_target_method_params (ompi_coll_com_rule_t* base_com_rule, size_t mpi_msgsize, int *result_topo_faninout,
344 int* result_segsize, int* max_requests)
345 {
346 ompi_coll_msg_rule_t* msg_p = (ompi_coll_msg_rule_t*) NULL;
347 ompi_coll_msg_rule_t* best_msg_p = (ompi_coll_msg_rule_t*) NULL;
348 int i;
349
350
351 if( (NULL == base_com_rule) || (0 == base_com_rule->n_msg_sizes)) {
352 return (0);
353 }
354
355
356
357
358 best_msg_p = msg_p = base_com_rule->msg_rules;
359 i = 0;
360
361 while (i<base_com_rule->n_msg_sizes) {
362
363
364 if (msg_p->msg_size <= mpi_msgsize) {
365 best_msg_p = msg_p;
366
367 }
368 else {
369
370 break;
371 }
372
373 msg_p++;
374 i++;
375 }
376
377 OPAL_OUTPUT((ompi_coll_tuned_stream,"Selected the following msg rule id %d\n", best_msg_p->msg_rule_id));
378 ompi_coll_tuned_dump_msg_rule (best_msg_p);
379
380
381 *result_topo_faninout = best_msg_p->result_topo_faninout;
382
383
384 *result_segsize = best_msg_p->result_segsize;
385
386
387 *max_requests = best_msg_p->result_max_requests;
388
389
390 return (best_msg_p->result_alg);
391 }