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