root/opal/datatype/opal_datatype_pack.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. pack_predefined_data
  2. pack_contiguous_loop

   1 /* -*- Mode: C; c-basic-offset:4 ; -*- */
   2 /*
   3  * Copyright (c) 2004-2009 The University of Tennessee and The University
   4  *                         of Tennessee Research Foundation.  All rights
   5  *                         reserved.
   6  * Copyright (c) 2009      Oak Ridge National Labs.  All rights reserved.
   7  * Copyright (c) 2011      NVIDIA Corporation.  All rights reserved.
   8  * Copyright (c) 2017-2018 Research Organization for Information Science
   9  *                         and Technology (RIST).  All rights reserved.
  10  * $COPYRIGHT$
  11  *
  12  * Additional copyrights may follow
  13  *
  14  * $HEADER$
  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 /* Make use of existing macro to do CUDA style memcpy */
  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;  /* nothing to do */
  47     }
  48 
  49     if( (ptrdiff_t)_copy_blength == _elem->extent ) {
  50         _copy_blength *= _copy_count;
  51         /* the extent and the size of the basic datatype are equal */
  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,    /* the convertor */                       \
 105                                   ELEM,         /* the basic element to be packed */      \
 106                                   COUNT,        /* the number of elements */              \
 107                                   SOURCE,       /* the source pointer (char*) */          \
 108                                   DESTINATION,  /* the destination pointer (char*) */     \
 109                                   SPACE )       /* the space in the destination buffer */ \
 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  /* OPAL_DATATYPE_PACK_H_HAS_BEEN_INCLUDED */

/* [<][>][^][v][top][bottom][index][help] */