This source file includes following definitions.
- opal_datatype_is_committed
- opal_datatype_is_overlapped
- opal_datatype_is_valid
- opal_datatype_is_predefined
- opal_datatype_is_contiguous_memory_layout
- opal_datatype_type_lb
- opal_datatype_type_ub
- opal_datatype_type_size
- opal_datatype_type_extent
- opal_datatype_get_extent
- opal_datatype_get_true_extent
- opal_datatype_span
   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 
  26 
  27 
  28 
  29 
  30 
  31 
  32 
  33 
  34 
  35 
  36 
  37 #ifndef OPAL_DATATYPE_H_HAS_BEEN_INCLUDED
  38 #define OPAL_DATATYPE_H_HAS_BEEN_INCLUDED
  39 
  40 #include "opal_config.h"
  41 
  42 #include <stddef.h>
  43 
  44 #include "opal/class/opal_object.h"
  45 
  46 BEGIN_C_DECLS
  47 
  48 
  49 
  50 
  51 
  52 
  53 
  54 #if !defined(OPAL_DATATYPE_MAX_PREDEFINED)
  55 #define OPAL_DATATYPE_MAX_PREDEFINED 26
  56 #endif
  57 
  58 
  59 
  60 
  61 
  62 
  63 
  64 #define OPAL_DATATYPE_MAX_SUPPORTED  50
  65 
  66 
  67 
  68 #define OPAL_DATATYPE_FLAG_UNAVAILABLE   0x0001  
  69 #define OPAL_DATATYPE_FLAG_PREDEFINED    0x0002  
  70 #define OPAL_DATATYPE_FLAG_COMMITTED     0x0004  
  71 #define OPAL_DATATYPE_FLAG_OVERLAP       0x0008  
  72 #define OPAL_DATATYPE_FLAG_CONTIGUOUS    0x0010  
  73 #define OPAL_DATATYPE_FLAG_NO_GAPS       0x0020  
  74 #define OPAL_DATATYPE_FLAG_USER_LB       0x0040  
  75 #define OPAL_DATATYPE_FLAG_USER_UB       0x0080  
  76 #define OPAL_DATATYPE_FLAG_DATA          0x0100  
  77 
  78 
  79 
  80 
  81 #define OPAL_DATATYPE_FLAG_BASIC         (OPAL_DATATYPE_FLAG_PREDEFINED | \
  82                                           OPAL_DATATYPE_FLAG_CONTIGUOUS | \
  83                                           OPAL_DATATYPE_FLAG_NO_GAPS |    \
  84                                           OPAL_DATATYPE_FLAG_DATA |       \
  85                                           OPAL_DATATYPE_FLAG_COMMITTED)
  86 
  87 
  88 
  89 
  90 
  91 #define MAX_DT_COMPONENT_COUNT UINT_MAX
  92 typedef size_t opal_datatype_count_t;
  93 
  94 typedef union dt_elem_desc dt_elem_desc_t;
  95 
  96 struct dt_type_desc_t {
  97     opal_datatype_count_t  length;  
  98     opal_datatype_count_t  used;    
  99     dt_elem_desc_t*        desc;
 100 };
 101 typedef struct dt_type_desc_t dt_type_desc_t;
 102 
 103 
 104 
 105 
 106 
 107 struct opal_datatype_t {
 108     opal_object_t      super;    
 109     uint16_t           flags;    
 110     uint16_t           id;       
 111     uint32_t           bdt_used; 
 112     size_t             size;     
 113 
 114     ptrdiff_t          true_lb;  
 115     ptrdiff_t          true_ub;  
 116     ptrdiff_t          lb;       
 117     ptrdiff_t          ub;       
 118     
 119     size_t             nbElems;  
 120     uint32_t           align;    
 121     uint32_t           loops;    
 122 
 123     
 124     char               name[OPAL_MAX_OBJECT_NAME];  
 125     dt_type_desc_t     desc;     
 126     dt_type_desc_t     opt_desc; 
 127 
 128 
 129     size_t             *ptypes;  
 130 
 131 
 132 
 133 
 134 
 135     
 136 
 137     
 138     
 139 };
 140 
 141 typedef struct opal_datatype_t opal_datatype_t;
 142 
 143 OPAL_DECLSPEC OBJ_CLASS_DECLARATION( opal_datatype_t );
 144 
 145 OPAL_DECLSPEC extern const opal_datatype_t* opal_datatype_basicDatatypes[OPAL_DATATYPE_MAX_PREDEFINED];
 146 OPAL_DECLSPEC extern const size_t opal_datatype_local_sizes[OPAL_DATATYPE_MAX_PREDEFINED];
 147 
 148 
 149 OPAL_DECLSPEC extern uint32_t opal_local_arch;
 150 
 151 
 152 
 153 
 154 OPAL_DECLSPEC extern const opal_datatype_t opal_datatype_empty;
 155 OPAL_DECLSPEC extern const opal_datatype_t opal_datatype_loop;
 156 OPAL_DECLSPEC extern const opal_datatype_t opal_datatype_end_loop;
 157 OPAL_DECLSPEC extern const opal_datatype_t opal_datatype_lb;
 158 OPAL_DECLSPEC extern const opal_datatype_t opal_datatype_ub;
 159 OPAL_DECLSPEC extern const opal_datatype_t opal_datatype_int1;       
 160 OPAL_DECLSPEC extern const opal_datatype_t opal_datatype_int2;       
 161 OPAL_DECLSPEC extern const opal_datatype_t opal_datatype_int4;       
 162 OPAL_DECLSPEC extern const opal_datatype_t opal_datatype_int8;       
 163 OPAL_DECLSPEC extern const opal_datatype_t opal_datatype_int16;      
 164 OPAL_DECLSPEC extern const opal_datatype_t opal_datatype_uint1;      
 165 OPAL_DECLSPEC extern const opal_datatype_t opal_datatype_uint2;      
 166 OPAL_DECLSPEC extern const opal_datatype_t opal_datatype_uint4;      
 167 OPAL_DECLSPEC extern const opal_datatype_t opal_datatype_uint8;      
 168 OPAL_DECLSPEC extern const opal_datatype_t opal_datatype_uint16;     
 169 OPAL_DECLSPEC extern const opal_datatype_t opal_datatype_float2;     
 170 OPAL_DECLSPEC extern const opal_datatype_t opal_datatype_float4;     
 171 OPAL_DECLSPEC extern const opal_datatype_t opal_datatype_float8;     
 172 OPAL_DECLSPEC extern const opal_datatype_t opal_datatype_float12;    
 173 OPAL_DECLSPEC extern const opal_datatype_t opal_datatype_float16;    
 174 OPAL_DECLSPEC extern const opal_datatype_t opal_datatype_short_float_complex;
 175 OPAL_DECLSPEC extern const opal_datatype_t opal_datatype_float_complex;
 176 OPAL_DECLSPEC extern const opal_datatype_t opal_datatype_double_complex;
 177 OPAL_DECLSPEC extern const opal_datatype_t opal_datatype_long_double_complex;
 178 OPAL_DECLSPEC extern const opal_datatype_t opal_datatype_bool;
 179 OPAL_DECLSPEC extern const opal_datatype_t opal_datatype_wchar;
 180 
 181 
 182 
 183 
 184 
 185 int opal_datatype_register_params(void);
 186 OPAL_DECLSPEC int32_t opal_datatype_init( void );
 187 OPAL_DECLSPEC opal_datatype_t* opal_datatype_create( int32_t expectedSize );
 188 OPAL_DECLSPEC int32_t opal_datatype_create_desc( opal_datatype_t * datatype, int32_t expectedSize );
 189 OPAL_DECLSPEC int32_t opal_datatype_commit( opal_datatype_t * pData );
 190 OPAL_DECLSPEC int32_t opal_datatype_destroy( opal_datatype_t** );
 191 OPAL_DECLSPEC int32_t opal_datatype_is_monotonic( opal_datatype_t* type);
 192 
 193 static inline int32_t
 194 opal_datatype_is_committed( const opal_datatype_t* type )
 195 {
 196     return ((type->flags & OPAL_DATATYPE_FLAG_COMMITTED) == OPAL_DATATYPE_FLAG_COMMITTED);
 197 }
 198 
 199 static inline int32_t
 200 opal_datatype_is_overlapped( const opal_datatype_t* type )
 201 {
 202     return ((type->flags & OPAL_DATATYPE_FLAG_OVERLAP) == OPAL_DATATYPE_FLAG_OVERLAP);
 203 }
 204 
 205 static inline int32_t
 206 opal_datatype_is_valid( const opal_datatype_t* type )
 207 {
 208     return !((type->flags & OPAL_DATATYPE_FLAG_UNAVAILABLE) == OPAL_DATATYPE_FLAG_UNAVAILABLE);
 209 }
 210 
 211 static inline int32_t
 212 opal_datatype_is_predefined( const opal_datatype_t* type )
 213 {
 214     return (type->flags & OPAL_DATATYPE_FLAG_PREDEFINED);
 215 }
 216 
 217 
 218 
 219 
 220 
 221 static inline int32_t
 222 opal_datatype_is_contiguous_memory_layout( const opal_datatype_t* datatype, int32_t count )
 223 {
 224     if( !(datatype->flags & OPAL_DATATYPE_FLAG_CONTIGUOUS) ) return 0;
 225     if( (count == 1) || (datatype->flags & OPAL_DATATYPE_FLAG_NO_GAPS) ) return 1;
 226     return 0;
 227 }
 228 
 229 
 230 OPAL_DECLSPEC void opal_datatype_dump( const opal_datatype_t* pData );
 231 
 232 OPAL_DECLSPEC int32_t opal_datatype_clone( const opal_datatype_t * src_type, opal_datatype_t * dest_type );
 233 OPAL_DECLSPEC int32_t opal_datatype_create_contiguous( int count, const opal_datatype_t* oldType, opal_datatype_t** newType );
 234 OPAL_DECLSPEC int32_t opal_datatype_resize( opal_datatype_t* type, ptrdiff_t lb, ptrdiff_t extent );
 235 OPAL_DECLSPEC int32_t opal_datatype_add( opal_datatype_t* pdtBase, const opal_datatype_t* pdtAdd, size_t count,
 236                                          ptrdiff_t disp, ptrdiff_t extent );
 237 
 238 static inline int32_t
 239 opal_datatype_type_lb( const opal_datatype_t* pData, ptrdiff_t* disp )
 240 {
 241     *disp = pData->lb;
 242     return 0;
 243 }
 244 
 245 static inline int32_t
 246 opal_datatype_type_ub( const opal_datatype_t* pData, ptrdiff_t* disp )
 247 {
 248     *disp = pData->ub;
 249     return 0;
 250 }
 251 
 252 static inline int32_t
 253 opal_datatype_type_size( const opal_datatype_t* pData, size_t *size )
 254 {
 255     *size = pData->size;
 256     return 0;
 257 }
 258 
 259 static inline int32_t
 260 opal_datatype_type_extent( const opal_datatype_t* pData, ptrdiff_t* extent )
 261 {
 262     *extent = pData->ub - pData->lb;
 263     return 0;
 264 }
 265 
 266 static inline int32_t
 267 opal_datatype_get_extent( const opal_datatype_t* pData, ptrdiff_t* lb, ptrdiff_t* extent)
 268 {
 269     *lb = pData->lb; *extent = pData->ub - pData->lb;
 270     return 0;
 271 }
 272 
 273 static inline int32_t
 274 opal_datatype_get_true_extent( const opal_datatype_t* pData, ptrdiff_t* true_lb, ptrdiff_t* true_extent)
 275 {
 276     *true_lb = pData->true_lb;
 277     *true_extent = (pData->true_ub - pData->true_lb);
 278     return 0;
 279 }
 280 
 281 OPAL_DECLSPEC ssize_t
 282 opal_datatype_get_element_count( const opal_datatype_t* pData, size_t iSize );
 283 OPAL_DECLSPEC int32_t
 284 opal_datatype_set_element_count( const opal_datatype_t* pData, size_t count, size_t* length );
 285 OPAL_DECLSPEC int32_t
 286 opal_datatype_copy_content_same_ddt( const opal_datatype_t* pData, int32_t count,
 287                                      char* pDestBuf, char* pSrcBuf );
 288 
 289 OPAL_DECLSPEC int opal_datatype_compute_ptypes( opal_datatype_t* datatype );
 290 
 291 OPAL_DECLSPEC const opal_datatype_t*
 292 opal_datatype_match_size( int size, uint16_t datakind, uint16_t datalang );
 293 
 294 
 295 
 296 
 297 OPAL_DECLSPEC int32_t
 298 opal_datatype_sndrcv( void *sbuf, int32_t scount, const opal_datatype_t* sdtype, void *rbuf,
 299                       int32_t rcount, const opal_datatype_t* rdtype);
 300 
 301 
 302 
 303 
 304 OPAL_DECLSPEC int32_t
 305 opal_datatype_get_args( const opal_datatype_t* pData, int32_t which,
 306                         int32_t * ci, int32_t * i,
 307                         int32_t * ca, ptrdiff_t* a,
 308                         int32_t * cd, opal_datatype_t** d, int32_t * type);
 309 OPAL_DECLSPEC int32_t
 310 opal_datatype_set_args( opal_datatype_t* pData,
 311                         int32_t ci, int32_t ** i,
 312                         int32_t ca, ptrdiff_t* a,
 313                         int32_t cd, opal_datatype_t** d,int32_t type);
 314 OPAL_DECLSPEC int32_t
 315 opal_datatype_copy_args( const opal_datatype_t* source_data,
 316                          opal_datatype_t* dest_data );
 317 OPAL_DECLSPEC int32_t
 318 opal_datatype_release_args( opal_datatype_t* pData );
 319 
 320 
 321 
 322 
 323 OPAL_DECLSPEC size_t
 324 opal_datatype_pack_description_length( const opal_datatype_t* datatype );
 325 
 326 
 327 
 328 
 329 OPAL_DECLSPEC int
 330 opal_datatype_get_pack_description( opal_datatype_t* datatype,
 331                                     const void** packed_buffer );
 332 
 333 
 334 
 335 
 336 struct opal_proc_t;
 337 OPAL_DECLSPEC opal_datatype_t*
 338 opal_datatype_create_from_packed_description( void** packed_buffer,
 339                                               struct opal_proc_t* remote_processor );
 340 
 341 
 342 
 343 
 344 
 345 
 346 
 347 
 348 
 349 
 350 static inline ptrdiff_t
 351 opal_datatype_span( const opal_datatype_t* pData, int64_t count,
 352                     ptrdiff_t* gap)
 353 {
 354     if (OPAL_UNLIKELY(0 == pData->size) || (0 == count)) {
 355         *gap = 0;
 356         return 0;
 357     }
 358     *gap = pData->true_lb;
 359     ptrdiff_t extent = (pData->ub - pData->lb);
 360     ptrdiff_t true_extent = (pData->true_ub - pData->true_lb);
 361     return true_extent + (count - 1) * extent;
 362 }
 363 
 364 #if OPAL_ENABLE_DEBUG
 365 
 366 
 367 
 368 
 369 OPAL_DECLSPEC int
 370 opal_datatype_safeguard_pointer_debug_breakpoint( const void* actual_ptr, int length,
 371                                                   const void* initial_ptr,
 372                                                   const opal_datatype_t* pData,
 373                                                   int count );
 374 #endif  
 375 
 376 END_C_DECLS
 377 #endif