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