This source file includes following definitions.
- opal_convertor_get_checksum
- opal_convertor_cleanup
- opal_convertor_need_buffers
- opal_convertor_get_packed_size
- opal_convertor_get_unpacked_size
- opal_convertor_get_current_pointer
- opal_convertor_get_offset_pointer
- opal_convertor_copy_and_prepare_for_send
- opal_convertor_copy_and_prepare_for_recv
- opal_convertor_set_position
- opal_convertor_personalize
- opal_convertor_clone_with_position
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 #ifndef OPAL_CONVERTOR_H_HAS_BEEN_INCLUDED
26 #define OPAL_CONVERTOR_H_HAS_BEEN_INCLUDED
27
28 #include "opal_config.h"
29
30 #ifdef HAVE_SYS_UIO_H
31 #include <sys/uio.h>
32 #endif
33
34 #include "opal/constants.h"
35 #include "opal/datatype/opal_datatype.h"
36 #include "opal/prefetch.h"
37
38 BEGIN_C_DECLS
39
40
41
42
43 #define CONVERTOR_DATATYPE_MASK 0x0000FFFF
44 #define CONVERTOR_SEND_CONVERSION 0x00010000
45 #define CONVERTOR_RECV 0x00020000
46 #define CONVERTOR_SEND 0x00040000
47 #define CONVERTOR_HOMOGENEOUS 0x00080000
48 #define CONVERTOR_NO_OP 0x00100000
49 #define CONVERTOR_WITH_CHECKSUM 0x00200000
50 #define CONVERTOR_CUDA 0x00400000
51 #define CONVERTOR_CUDA_ASYNC 0x00800000
52 #define CONVERTOR_TYPE_MASK 0x10FF0000
53 #define CONVERTOR_STATE_START 0x01000000
54 #define CONVERTOR_STATE_COMPLETE 0x02000000
55 #define CONVERTOR_STATE_ALLOC 0x04000000
56 #define CONVERTOR_COMPLETED 0x08000000
57 #define CONVERTOR_CUDA_UNIFIED 0x10000000
58 #define CONVERTOR_HAS_REMOTE_SIZE 0x20000000
59 #define CONVERTOR_SKIP_CUDA_INIT 0x40000000
60
61 union dt_elem_desc;
62 typedef struct opal_convertor_t opal_convertor_t;
63
64 typedef int32_t (*convertor_advance_fct_t)( opal_convertor_t* pConvertor,
65 struct iovec* iov,
66 uint32_t* out_size,
67 size_t* max_data );
68 typedef void*(*memalloc_fct_t)( size_t* pLength, void* userdata );
69 typedef void*(*memcpy_fct_t)( void* dest, const void* src, size_t n, opal_convertor_t* pConvertor );
70
71
72 struct opal_convertor_master_t;
73
74 struct dt_stack_t {
75 int32_t index;
76 int16_t type;
77 int16_t padding;
78 size_t count;
79 ptrdiff_t disp;
80 };
81 typedef struct dt_stack_t dt_stack_t;
82
83
84
85
86 #define DT_STATIC_STACK_SIZE 5
87
88 struct opal_convertor_t {
89 opal_object_t super;
90 uint32_t remoteArch;
91 uint32_t flags;
92 size_t local_size;
93 size_t remote_size;
94 const opal_datatype_t* pDesc;
95 const dt_type_desc_t* use_desc;
96 opal_datatype_count_t count;
97
98
99 uint32_t stack_size;
100 unsigned char* pBaseBuf;
101 dt_stack_t* pStack;
102 convertor_advance_fct_t fAdvance;
103
104
105 struct opal_convertor_master_t* master;
106
107
108 uint32_t stack_pos;
109 size_t partial_length;
110 size_t bConverted;
111
112
113 uint32_t checksum;
114 uint32_t csum_ui1;
115 size_t csum_ui2;
116
117
118 dt_stack_t static_stack[DT_STATIC_STACK_SIZE];
119
120 #if OPAL_CUDA_SUPPORT
121 memcpy_fct_t cbmemcpy;
122 void * stream;
123 #endif
124 };
125 OPAL_DECLSPEC OBJ_CLASS_DECLARATION( opal_convertor_t );
126
127
128
129
130
131 static inline uint32_t opal_convertor_get_checksum( opal_convertor_t* convertor )
132 {
133 return convertor->checksum;
134 }
135
136
137
138
139
140 OPAL_DECLSPEC int32_t opal_convertor_pack( opal_convertor_t* pConv, struct iovec* iov,
141 uint32_t* out_size, size_t* max_data );
142
143
144
145
146 OPAL_DECLSPEC int32_t opal_convertor_unpack( opal_convertor_t* pConv, struct iovec* iov,
147 uint32_t* out_size, size_t* max_data );
148
149
150
151
152 OPAL_DECLSPEC opal_convertor_t* opal_convertor_create( int32_t remote_arch, int32_t mode );
153
154
155
156
157
158
159
160
161
162 static inline int opal_convertor_cleanup( opal_convertor_t* convertor )
163 {
164 if( OPAL_UNLIKELY(convertor->stack_size > DT_STATIC_STACK_SIZE) ) {
165 free( convertor->pStack );
166 convertor->pStack = convertor->static_stack;
167 convertor->stack_size = DT_STATIC_STACK_SIZE;
168 }
169 convertor->pDesc = NULL;
170 convertor->stack_pos = 0;
171 convertor->flags = OPAL_DATATYPE_FLAG_NO_GAPS | CONVERTOR_COMPLETED;
172
173 return OPAL_SUCCESS;
174 }
175
176
177
178
179
180
181
182
183
184
185 static inline int32_t opal_convertor_need_buffers( const opal_convertor_t* pConvertor )
186 {
187 if (OPAL_UNLIKELY(0 == (pConvertor->flags & CONVERTOR_HOMOGENEOUS))) return 1;
188 #if OPAL_CUDA_SUPPORT
189 if( pConvertor->flags & (CONVERTOR_CUDA | CONVERTOR_CUDA_UNIFIED)) return 1;
190 #endif
191 if( pConvertor->flags & OPAL_DATATYPE_FLAG_NO_GAPS ) return 0;
192 if( (pConvertor->count == 1) && (pConvertor->flags & OPAL_DATATYPE_FLAG_CONTIGUOUS) ) return 0;
193 return 1;
194 }
195
196
197
198
199
200
201 size_t
202 opal_convertor_compute_remote_size( opal_convertor_t* pConv );
203
204
205
206
207 static inline void opal_convertor_get_packed_size( const opal_convertor_t* pConv,
208 size_t* pSize )
209 {
210 *pSize = pConv->local_size;
211 }
212
213
214
215
216
217
218
219 static inline void opal_convertor_get_unpacked_size( const opal_convertor_t* pConv,
220 size_t* pSize )
221 {
222 if( pConv->flags & CONVERTOR_HOMOGENEOUS ) {
223 *pSize = pConv->local_size;
224 return;
225 }
226 if( 0 == (CONVERTOR_HAS_REMOTE_SIZE & pConv->flags) ) {
227 assert(! (pConv->flags & CONVERTOR_SEND));
228 opal_convertor_compute_remote_size( (opal_convertor_t*)pConv);
229 }
230 *pSize = pConv->remote_size;
231 }
232
233
234
235
236
237
238 static inline void opal_convertor_get_current_pointer( const opal_convertor_t* pConv,
239 void** position )
240 {
241 unsigned char* base = pConv->pBaseBuf + pConv->bConverted + pConv->pDesc->true_lb;
242 *position = (void*)base;
243 }
244
245 static inline void opal_convertor_get_offset_pointer( const opal_convertor_t* pConv,
246 size_t offset, void** position )
247 {
248 unsigned char* base = pConv->pBaseBuf + offset + pConv->pDesc->true_lb;
249 *position = (void*)base;
250 }
251
252
253
254
255
256 OPAL_DECLSPEC int32_t opal_convertor_prepare_for_send( opal_convertor_t* convertor,
257 const struct opal_datatype_t* datatype,
258 size_t count,
259 const void* pUserBuf);
260
261 static inline int32_t opal_convertor_copy_and_prepare_for_send( const opal_convertor_t* pSrcConv,
262 const struct opal_datatype_t* datatype,
263 size_t count,
264 const void* pUserBuf,
265 int32_t flags,
266 opal_convertor_t* convertor )
267 {
268 convertor->remoteArch = pSrcConv->remoteArch;
269 convertor->flags = pSrcConv->flags | flags;
270 convertor->master = pSrcConv->master;
271
272 return opal_convertor_prepare_for_send( convertor, datatype, count, pUserBuf );
273 }
274
275
276
277
278 OPAL_DECLSPEC int32_t opal_convertor_prepare_for_recv( opal_convertor_t* convertor,
279 const struct opal_datatype_t* datatype,
280 size_t count,
281 const void* pUserBuf );
282 static inline int32_t opal_convertor_copy_and_prepare_for_recv( const opal_convertor_t* pSrcConv,
283 const struct opal_datatype_t* datatype,
284 size_t count,
285 const void* pUserBuf,
286 int32_t flags,
287 opal_convertor_t* convertor )
288 {
289 convertor->remoteArch = pSrcConv->remoteArch;
290 convertor->flags = (pSrcConv->flags | flags);
291 convertor->master = pSrcConv->master;
292
293 return opal_convertor_prepare_for_recv( convertor, datatype, count, pUserBuf );
294 }
295
296
297
298
299 OPAL_DECLSPEC int32_t
300 opal_convertor_raw( opal_convertor_t* convertor,
301 struct iovec* iov,
302 uint32_t* iov_count,
303 size_t* length );
304
305
306
307
308
309 OPAL_DECLSPEC int32_t
310 opal_convertor_set_position_nocheck( opal_convertor_t* convertor,
311 size_t* position );
312 static inline int32_t
313 opal_convertor_set_position( opal_convertor_t* convertor,
314 size_t* position )
315 {
316
317
318
319
320 if( OPAL_UNLIKELY(convertor->local_size <= *position) ) {
321 convertor->flags |= CONVERTOR_COMPLETED;
322 convertor->bConverted = convertor->local_size;
323 *position = convertor->bConverted;
324 return OPAL_SUCCESS;
325 }
326
327
328
329
330 if( OPAL_LIKELY((*position) == convertor->bConverted) ) return OPAL_SUCCESS;
331
332
333 convertor->flags &= ~CONVERTOR_COMPLETED;
334
335 if( !(convertor->flags & CONVERTOR_WITH_CHECKSUM) &&
336 (convertor->flags & OPAL_DATATYPE_FLAG_NO_GAPS) &&
337 (convertor->flags & (CONVERTOR_SEND | CONVERTOR_HOMOGENEOUS)) ) {
338
339 convertor->bConverted = *position;
340 return OPAL_SUCCESS;
341 }
342
343 return opal_convertor_set_position_nocheck( convertor, position );
344 }
345
346
347
348
349 static inline int32_t
350 opal_convertor_personalize( opal_convertor_t* convertor,
351 uint32_t flags,
352 size_t* position )
353 {
354 convertor->flags |= flags;
355
356 if( OPAL_UNLIKELY(NULL == position) )
357 return OPAL_SUCCESS;
358 return opal_convertor_set_position( convertor, position );
359 }
360
361
362
363
364 OPAL_DECLSPEC int
365 opal_convertor_clone( const opal_convertor_t* source,
366 opal_convertor_t* destination,
367 int32_t copy_stack );
368
369 static inline int
370 opal_convertor_clone_with_position( const opal_convertor_t* source,
371 opal_convertor_t* destination,
372 int32_t copy_stack,
373 size_t* position )
374 {
375 (void)opal_convertor_clone( source, destination, copy_stack );
376 return opal_convertor_set_position( destination, position );
377 }
378
379
380
381
382 OPAL_DECLSPEC void
383 opal_convertor_dump( opal_convertor_t* convertor );
384
385 OPAL_DECLSPEC void
386 opal_datatype_dump_stack( const dt_stack_t* pStack,
387 int stack_pos,
388 const union dt_elem_desc* pDesc,
389 const char* name );
390
391
392
393
394 OPAL_DECLSPEC int
395 opal_convertor_generic_simple_position( opal_convertor_t* pConvertor,
396 size_t* position );
397
398 END_C_DECLS
399
400 #endif