This source file includes following definitions.
- mca_bml_base_btl_array_get_size
- mca_bml_base_btl_array_set_size
- mca_bml_base_btl_array_insert
- mca_bml_base_btl_array_remove
- mca_bml_base_btl_array_get_index
- mca_bml_base_btl_array_get_next
- mca_bml_base_btl_array_find
- mca_bml_base_alloc
- mca_bml_base_free
- mca_bml_base_send
- mca_bml_base_send_status
- mca_bml_base_sendi
- mca_bml_base_put
- mca_bml_base_get
- mca_bml_base_prepare_src
- mca_bml_base_register_mem
- mca_bml_base_deregister_mem
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 #ifndef MCA_BML_H
30 #define MCA_BML_H
31
32 #include "ompi_config.h"
33 #include "ompi/mca/mca.h"
34 #include "opal/datatype/opal_convertor.h"
35 #include "opal/mca/crs/crs.h"
36 #include "opal/mca/crs/base/base.h"
37 #include "opal/mca/btl/btl.h"
38
39 #include "ompi/mca/bml/base/bml_base_btl.h"
40 #include "ompi/types.h"
41
42 #include "ompi/constants.h"
43
44 #define OPAL_ENABLE_DEBUG_RELIABILITY 0
45
46
47
48
49
50 struct ompi_proc_t;
51 struct mca_bml_base_module_t;
52 struct mca_bml_base_endpoint_t;
53 struct mca_mpool_base_resources_t;
54
55
56
57
58
59 struct mca_bml_base_btl_t {
60 uint32_t btl_flags;
61 float btl_weight;
62 struct mca_btl_base_module_t *btl;
63 struct mca_btl_base_endpoint_t* btl_endpoint;
64 };
65 typedef struct mca_bml_base_btl_t mca_bml_base_btl_t;
66
67
68
69
70
71
72
73
74 struct mca_bml_base_btl_array_t {
75 opal_object_t super;
76 size_t arr_size;
77 size_t arr_reserve;
78 size_t arr_index;
79 mca_bml_base_btl_t* bml_btls;
80 };
81 typedef struct mca_bml_base_btl_array_t mca_bml_base_btl_array_t;
82
83 OMPI_DECLSPEC OBJ_CLASS_DECLARATION(mca_bml_base_btl_array_t);
84
85
86
87
88
89
90
91
92 static inline size_t mca_bml_base_btl_array_get_size(mca_bml_base_btl_array_t* array)
93 {
94 return array->arr_size;
95 }
96
97
98
99
100
101
102
103 static inline void mca_bml_base_btl_array_set_size(mca_bml_base_btl_array_t* array, size_t size)
104 {
105 if(array->arr_size > array->arr_reserve)
106 mca_bml_base_btl_array_reserve(array, size);
107 array->arr_size = size;
108 }
109
110
111
112
113
114
115 static inline mca_bml_base_btl_t* mca_bml_base_btl_array_insert(mca_bml_base_btl_array_t* array)
116 {
117 #if OPAL_ENABLE_DEBUG
118 if(array->arr_size >= array->arr_reserve) {
119 opal_output(0, "mca_bml_base_btl_array_insert: invalid array index %lu >= %lu",
120 (unsigned long)array->arr_size, (unsigned long)array->arr_reserve);
121 return 0;
122 }
123 #endif
124 return &array->bml_btls[array->arr_size++];
125 }
126
127
128
129
130
131
132
133 static inline bool mca_bml_base_btl_array_remove( mca_bml_base_btl_array_t* array,
134 struct mca_btl_base_module_t* btl )
135 {
136 size_t i = 0;
137
138 for( i = 0; i < array->arr_size; i++ ) {
139 if( array->bml_btls[i].btl == btl ) {
140
141 for( ; i < array->arr_size-1; i++ ) {
142
143
144 array->bml_btls[i] = array->bml_btls[(i+1)];
145 }
146 array->arr_size--;
147 array->arr_index = 0;
148 return true;
149 }
150 }
151 return false;
152 }
153
154
155
156
157
158
159
160
161 static inline mca_bml_base_btl_t* mca_bml_base_btl_array_get_index(mca_bml_base_btl_array_t* array, size_t item_index)
162 {
163 if (item_index < array->arr_size) {
164 return &array->bml_btls[item_index];
165 }
166
167 return NULL;
168 }
169
170
171
172
173
174
175
176
177 static inline mca_bml_base_btl_t* mca_bml_base_btl_array_get_next(mca_bml_base_btl_array_t* array)
178 {
179 #if OPAL_ENABLE_DEBUG
180 if(array->arr_size == 0) {
181 opal_output(0, "mca_bml_base_btl_array_get_next: invalid array size");
182 return 0;
183 }
184 #endif
185 if( 1 == array->arr_size ) {
186 return &array->bml_btls[0];
187 } else {
188 size_t current_position = array->arr_index;
189 if( (current_position + 1) == array->arr_size ) {
190 array->arr_index = 0;
191 } else {
192 array->arr_index = current_position + 1;
193 }
194 return &array->bml_btls[current_position];
195 }
196 }
197
198
199
200
201
202
203
204 static inline mca_bml_base_btl_t* mca_bml_base_btl_array_find(
205 mca_bml_base_btl_array_t* array, struct mca_btl_base_module_t* btl)
206 {
207 size_t i=0;
208 for(i=0; i<array->arr_size; i++) {
209 if(array->bml_btls[i].btl == btl) {
210 return &array->bml_btls[i];
211 }
212 }
213 return NULL;
214 }
215
216
217
218
219
220 struct mca_bml_base_endpoint_t {
221 opal_list_item_t super;
222 struct ompi_proc_t* btl_proc;
223 size_t btl_pipeline_send_length;
224 size_t btl_send_limit;
225 size_t btl_max_send_size;
226 mca_bml_base_btl_array_t btl_eager;
227 mca_bml_base_btl_array_t btl_send;
228 mca_bml_base_btl_array_t btl_rdma;
229 size_t btl_rdma_index;
230 uint32_t btl_flags_or;
231 };
232 typedef struct mca_bml_base_endpoint_t mca_bml_base_endpoint_t;
233
234
235 OMPI_DECLSPEC OBJ_CLASS_DECLARATION(mca_bml_base_endpoint_t);
236
237 static inline void mca_bml_base_alloc( mca_bml_base_btl_t* bml_btl,
238 mca_btl_base_descriptor_t** des,
239 uint8_t order, size_t size, uint32_t flags )
240 {
241 mca_btl_base_module_t* btl = bml_btl->btl;
242 *des = btl->btl_alloc(btl, bml_btl->btl_endpoint, order, size, flags);
243 }
244
245 static inline void mca_bml_base_free( mca_bml_base_btl_t* bml_btl,
246 mca_btl_base_descriptor_t* des )
247 {
248 mca_btl_base_module_t* btl = bml_btl->btl;
249
250 btl->btl_free( btl, des );
251
252
253
254 }
255
256 #if OPAL_ENABLE_DEBUG_RELIABILITY
257
258 int mca_bml_base_send( mca_bml_base_btl_t* bml_btl,
259 mca_btl_base_descriptor_t* des,
260 mca_btl_base_tag_t tag );
261
262
263 #else
264
265 static inline int mca_bml_base_send( mca_bml_base_btl_t* bml_btl,
266 mca_btl_base_descriptor_t* des,
267 mca_btl_base_tag_t tag )
268 {
269 int rc;
270 mca_btl_base_module_t* btl = bml_btl->btl;
271
272 des->des_context = (void*) bml_btl;
273 rc = btl->btl_send(btl, bml_btl->btl_endpoint, des, tag);
274 if (rc == OMPI_ERR_RESOURCE_BUSY)
275 rc = OMPI_SUCCESS;
276
277 return rc;
278 }
279
280 #endif
281
282 static inline int mca_bml_base_send_status( mca_bml_base_btl_t* bml_btl,
283 mca_btl_base_descriptor_t* des,
284 mca_btl_base_tag_t tag )
285 {
286 mca_btl_base_module_t* btl = bml_btl->btl;
287
288 des->des_context = (void*) bml_btl;
289 return btl->btl_send(btl, bml_btl->btl_endpoint, des, tag);
290 }
291
292 static inline int mca_bml_base_sendi( mca_bml_base_btl_t* bml_btl,
293 struct opal_convertor_t* convertor,
294 void* header,
295 size_t header_size,
296 size_t payload_size,
297 uint8_t order,
298 uint32_t flags,
299 mca_btl_base_tag_t tag,
300 mca_btl_base_descriptor_t** descriptor )
301 {
302 mca_btl_base_module_t* btl = bml_btl->btl;
303 return btl->btl_sendi(btl, bml_btl->btl_endpoint,
304 convertor, header, header_size,
305 payload_size, order, flags, tag, descriptor);
306 }
307
308 static inline int mca_bml_base_put( mca_bml_base_btl_t* bml_btl, void *local_address, uint64_t remote_address,
309 struct mca_btl_base_registration_handle_t *local_handle,
310 struct mca_btl_base_registration_handle_t *remote_handle, size_t size,
311 int flags, int order, mca_btl_base_rdma_completion_fn_t cbfunc, void *cbdata)
312 {
313 mca_btl_base_module_t* btl = bml_btl->btl;
314
315 return btl->btl_put( btl, bml_btl->btl_endpoint, local_address, remote_address, local_handle,
316 remote_handle, size, flags, order, cbfunc, (void *) bml_btl, cbdata);
317 }
318
319 static inline int mca_bml_base_get( mca_bml_base_btl_t* bml_btl, void *local_address, uint64_t remote_address,
320 struct mca_btl_base_registration_handle_t *local_handle,
321 struct mca_btl_base_registration_handle_t *remote_handle, size_t size,
322 int flags, int order, mca_btl_base_rdma_completion_fn_t cbfunc, void *cbdata)
323 {
324 mca_btl_base_module_t* btl = bml_btl->btl;
325
326 return btl->btl_get( btl, bml_btl->btl_endpoint, local_address, remote_address, local_handle,
327 remote_handle, size, flags, order, cbfunc, (void *) bml_btl, cbdata);
328 }
329
330
331 static inline void mca_bml_base_prepare_src(mca_bml_base_btl_t* bml_btl,
332 struct opal_convertor_t* conv,
333 uint8_t order,
334 size_t reserve,
335 size_t *size,
336 uint32_t flags,
337 mca_btl_base_descriptor_t** des)
338 {
339 mca_btl_base_module_t* btl = bml_btl->btl;
340
341 *des = btl->btl_prepare_src( btl, bml_btl->btl_endpoint, conv,
342 order, reserve, size, flags );
343 if( OPAL_LIKELY((*des) != NULL) ) {
344 (*des)->des_context = (void*) bml_btl;
345 }
346 }
347
348 static inline void mca_bml_base_register_mem (mca_bml_base_btl_t* bml_btl, void *base,
349 size_t size, uint32_t flags,
350 mca_btl_base_registration_handle_t **handle)
351 {
352 mca_btl_base_module_t* btl = bml_btl->btl;
353
354 *handle = btl->btl_register_mem (btl, bml_btl->btl_endpoint, base, size, flags);
355 }
356
357 static inline void mca_bml_base_deregister_mem (mca_bml_base_btl_t* bml_btl, mca_btl_base_registration_handle_t *handle)
358 {
359 mca_btl_base_module_t* btl = bml_btl->btl;
360
361 btl->btl_deregister_mem (btl, handle);
362 }
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394 typedef struct mca_bml_base_module_t* (*mca_bml_base_component_init_fn_t)(
395 int* priority,
396 bool enable_progress_threads,
397 bool enable_mpi_threads
398 );
399
400
401
402
403
404
405 struct mca_bml_base_component_2_0_0_t {
406 mca_base_component_t bml_version;
407 mca_base_component_data_t bml_data;
408 mca_bml_base_component_init_fn_t bml_init;
409 };
410 typedef struct mca_bml_base_component_2_0_0_t mca_bml_base_component_2_0_0_t;
411 typedef struct mca_bml_base_component_2_0_0_t mca_bml_base_component_t;
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430 typedef int (*mca_bml_base_module_finalize_fn_t)( void );
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459 typedef int (*mca_bml_base_module_add_procs_fn_t)(
460 size_t nprocs,
461 struct ompi_proc_t** procs,
462 struct opal_bitmap_t* reachable
463 );
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482 typedef int (*mca_bml_base_module_add_proc_fn_t) (struct ompi_proc_t *proc);
483
484
485
486
487
488
489
490
491
492
493
494
495 typedef int (*mca_bml_base_module_del_procs_fn_t)(
496 size_t nprocs,
497 struct ompi_proc_t** procs
498 );
499
500
501
502
503
504
505
506
507
508
509 typedef int (*mca_bml_base_module_add_btl_fn_t)( struct mca_btl_base_module_t* );
510
511
512
513
514
515
516
517
518
519
520 typedef int (*mca_bml_base_module_del_btl_fn_t)( struct mca_btl_base_module_t* );
521
522
523
524
525
526
527
528
529
530
531 typedef int (*mca_bml_base_module_del_proc_btl_fn_t)(
532 struct ompi_proc_t*,
533 struct mca_btl_base_module_t* );
534
535
536
537
538
539
540
541
542
543
544
545
546 typedef int (*mca_bml_base_module_register_fn_t)(
547 mca_btl_base_tag_t tag,
548 mca_btl_base_module_recv_cb_fn_t cbfunc,
549 void* cbdata
550 );
551
552
553
554
555
556
557
558 typedef int (*mca_bml_base_module_register_error_cb_fn_t)(
559 mca_btl_base_module_error_cb_fn_t cbfunc
560 );
561
562
563
564
565
566
567 typedef int (*mca_bml_base_module_ft_event_fn_t)(int status);
568
569
570
571
572
573 struct mca_bml_base_module_t {
574
575 mca_bml_base_component_t* bml_component;
576
577
578 mca_bml_base_module_add_proc_fn_t bml_add_proc;
579 mca_bml_base_module_add_procs_fn_t bml_add_procs;
580 mca_bml_base_module_del_procs_fn_t bml_del_procs;
581 mca_bml_base_module_add_btl_fn_t bml_add_btl;
582 mca_bml_base_module_del_btl_fn_t bml_del_btl;
583 mca_bml_base_module_del_proc_btl_fn_t bml_del_proc_btl;
584 mca_bml_base_module_register_fn_t bml_register;
585 mca_bml_base_module_register_error_cb_fn_t bml_register_error;
586
587 mca_bml_base_module_finalize_fn_t bml_finalize;
588
589 mca_bml_base_module_ft_event_fn_t bml_ft_event;
590 };
591 typedef struct mca_bml_base_module_t mca_bml_base_module_t;
592
593
594
595
596 #define MCA_BML_BASE_VERSION_2_0_0 \
597 OMPI_MCA_BASE_VERSION_2_1_0("bml", 2, 0, 0)
598
599 #endif