This source file includes following definitions.
- pack_predefined_data
- pack_contiguous_loop
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 #ifndef OPAL_DATATYPE_PACK_H_HAS_BEEN_INCLUDED
18 #define OPAL_DATATYPE_PACK_H_HAS_BEEN_INCLUDED
19
20 #include "opal_config.h"
21
22 #include <stddef.h>
23
24 #if !defined(CHECKSUM) && OPAL_CUDA_SUPPORT
25
26 #undef MEMCPY_CSUM
27 #define MEMCPY_CSUM( DST, SRC, BLENGTH, CONVERTOR ) \
28 CONVERTOR->cbmemcpy( (DST), (SRC), (BLENGTH), (CONVERTOR) )
29 #endif
30
31 static inline void pack_predefined_data( opal_convertor_t* CONVERTOR,
32 const dt_elem_desc_t* ELEM,
33 size_t* COUNT,
34 unsigned char** SOURCE,
35 unsigned char** DESTINATION,
36 size_t* SPACE )
37 {
38 size_t _copy_count = *(COUNT);
39 size_t _copy_blength;
40 const ddt_elem_desc_t* _elem = &((ELEM)->elem);
41 unsigned char* _source = (*SOURCE) + _elem->disp;
42
43 _copy_blength = opal_datatype_basicDatatypes[_elem->common.type]->size;
44 if( (_copy_count * _copy_blength) > *(SPACE) ) {
45 _copy_count = (*(SPACE) / _copy_blength);
46 if( 0 == _copy_count ) return;
47 }
48
49 if( (ptrdiff_t)_copy_blength == _elem->extent ) {
50 _copy_blength *= _copy_count;
51
52 OPAL_DATATYPE_SAFEGUARD_POINTER( _source, _copy_blength, (CONVERTOR)->pBaseBuf,
53 (CONVERTOR)->pDesc, (CONVERTOR)->count );
54 DO_DEBUG( opal_output( 0, "pack 1. memcpy( %p, %p, %lu ) => space %lu\n",
55 (void*)*(DESTINATION), (void*)_source, (unsigned long)_copy_blength, (unsigned long)(*(SPACE)) ); );
56 MEMCPY_CSUM( *(DESTINATION), _source, _copy_blength, (CONVERTOR) );
57 _source += _copy_blength;
58 *(DESTINATION) += _copy_blength;
59 } else {
60 for(size_t _i = 0; _i < _copy_count; _i++ ) {
61 OPAL_DATATYPE_SAFEGUARD_POINTER( _source, _copy_blength, (CONVERTOR)->pBaseBuf,
62 (CONVERTOR)->pDesc, (CONVERTOR)->count );
63 DO_DEBUG( opal_output( 0, "pack 2. memcpy( %p, %p, %lu ) => space %lu\n",
64 (void*)*(DESTINATION), (void*)_source, (unsigned long)_copy_blength, (unsigned long)(*(SPACE) - (_i * _copy_blength)) ); );
65 MEMCPY_CSUM( *(DESTINATION), _source, _copy_blength, (CONVERTOR) );
66 *(DESTINATION) += _copy_blength;
67 _source += _elem->extent;
68 }
69 _copy_blength *= _copy_count;
70 }
71 *(SOURCE) = _source - _elem->disp;
72 *(SPACE) -= _copy_blength;
73 *(COUNT) -= _copy_count;
74 }
75
76 static inline void pack_contiguous_loop( opal_convertor_t* CONVERTOR,
77 const dt_elem_desc_t* ELEM,
78 size_t* COUNT,
79 unsigned char** SOURCE,
80 unsigned char** DESTINATION,
81 size_t* SPACE )
82 {
83 const ddt_loop_desc_t *_loop = (ddt_loop_desc_t*)(ELEM);
84 const ddt_endloop_desc_t* _end_loop = (ddt_endloop_desc_t*)((ELEM) + _loop->items);
85 unsigned char* _source = (*SOURCE) + _end_loop->first_elem_disp;
86 size_t _copy_loops = *(COUNT);
87
88 if( (_copy_loops * _end_loop->size) > *(SPACE) )
89 _copy_loops = (*(SPACE) / _end_loop->size);
90 for(size_t _i = 0; _i < _copy_loops; _i++ ) {
91 OPAL_DATATYPE_SAFEGUARD_POINTER( _source, _end_loop->size, (CONVERTOR)->pBaseBuf,
92 (CONVERTOR)->pDesc, (CONVERTOR)->count );
93 DO_DEBUG( opal_output( 0, "pack 3. memcpy( %p, %p, %lu ) => space %lu\n",
94 (void*)*(DESTINATION), (void*)_source, (unsigned long)_end_loop->size, (unsigned long)(*(SPACE) - _i * _end_loop->size) ); );
95 MEMCPY_CSUM( *(DESTINATION), _source, _end_loop->size, (CONVERTOR) );
96 *(DESTINATION) += _end_loop->size;
97 _source += _loop->extent;
98 }
99 *(SOURCE) = _source - _end_loop->first_elem_disp;
100 *(SPACE) -= _copy_loops * _end_loop->size;
101 *(COUNT) -= _copy_loops;
102 }
103
104 #define PACK_PREDEFINED_DATATYPE( CONVERTOR, \
105 ELEM, \
106 COUNT, \
107 SOURCE, \
108 DESTINATION, \
109 SPACE ) \
110 pack_predefined_data( (CONVERTOR), (ELEM), &(COUNT), &(SOURCE), &(DESTINATION), &(SPACE) )
111
112 #define PACK_CONTIGUOUS_LOOP( CONVERTOR, ELEM, COUNT, SOURCE, DESTINATION, SPACE ) \
113 pack_contiguous_loop( (CONVERTOR), (ELEM), &(COUNT), &(SOURCE), &(DESTINATION), &(SPACE) )
114
115 #endif