@@ -449,6 +449,86 @@ int32_t opal_generic_simple_unpack_function(opal_convertor_t *pConvertor, struct
449449 * 1 if everything went fine and the data was completly converted
450450 * -1 something wrong occurs.
451451 */
452+ static inline void
453+ unpack_predefined_heterogeneous (opal_convertor_t * CONVERTOR ,
454+ const dt_elem_desc_t * ELEM , size_t * COUNT ,
455+ unsigned char * * memory ,
456+ unsigned char * * packed , size_t * SPACE )
457+ {
458+ const opal_convertor_master_t * master = (CONVERTOR )-> master ;
459+ const ddt_elem_desc_t * _elem = & ((ELEM )-> elem );
460+ size_t cando_count = * (COUNT ), do_now_bytes ;
461+ size_t local_elem_size = opal_datatype_basicDatatypes [_elem -> common .type ]-> size ;
462+ size_t remote_elem_size = master -> remote_sizes [_elem -> common .type ];
463+ size_t blocklen_bytes = remote_elem_size ;
464+ unsigned char * _memory = (* memory ) + _elem -> disp ;
465+ unsigned char * _packed = * packed ;
466+ ptrdiff_t advance = 0 ;
467+
468+ assert (0 == (cando_count % _elem -> blocklen )); /* no partials here */
469+ assert (* (COUNT ) <= ((size_t ) _elem -> count * _elem -> blocklen ));
470+
471+ if ((remote_elem_size * cando_count ) > * (SPACE ))
472+ cando_count = (* SPACE ) / blocklen_bytes ;
473+
474+ /* premptively update the number of COUNT we will return. */
475+ * (COUNT ) -= cando_count ;
476+
477+ if (_elem -> blocklen == 1 ) {
478+ master -> pFunctions [_elem -> common .type ](CONVERTOR , cando_count ,
479+ _packed , * SPACE , remote_elem_size ,
480+ _memory , * SPACE , _elem -> extent ,
481+ & advance );
482+ _memory += cando_count * _elem -> extent ;
483+ _packed += cando_count * local_elem_size ;
484+ goto update_and_return ;
485+ }
486+
487+ if ((1 < _elem -> count ) && (_elem -> blocklen <= cando_count )) {
488+ blocklen_bytes = remote_elem_size * _elem -> blocklen ;
489+
490+ do { /* Do as many full blocklen as possible */
491+ OPAL_DATATYPE_SAFEGUARD_POINTER (_memory , blocklen_bytes , (CONVERTOR )-> pBaseBuf ,
492+ (CONVERTOR )-> pDesc , (CONVERTOR )-> count );
493+ DO_DEBUG (opal_output (0 , "pack 2. memcpy( %p, %p, %lu ) => space %lu\n" ,
494+ (void * ) _packed , (void * ) _memory , (unsigned long ) blocklen_bytes ,
495+ (unsigned long ) (* (SPACE ) - (_packed - * (packed )))););
496+ master -> pFunctions [_elem -> common .type ](CONVERTOR , _elem -> blocklen ,
497+ _packed , * SPACE , remote_elem_size ,
498+ _memory , * SPACE , local_elem_size ,
499+ & advance );
500+ _packed += blocklen_bytes ;
501+ _memory += _elem -> extent ;
502+ cando_count -= _elem -> blocklen ;
503+ } while (_elem -> blocklen <= cando_count );
504+ }
505+
506+ /**
507+ * As an epilog do anything left from the last blocklen.
508+ */
509+ if (0 != cando_count ) {
510+ assert ((cando_count < _elem -> blocklen )
511+ || ((1 == _elem -> count ) && (cando_count <= _elem -> blocklen )));
512+ do_now_bytes = cando_count * remote_elem_size ;
513+ OPAL_DATATYPE_SAFEGUARD_POINTER (_memory , do_now_bytes , (CONVERTOR )-> pBaseBuf ,
514+ (CONVERTOR )-> pDesc , (CONVERTOR )-> count );
515+ DO_DEBUG (opal_output (0 , "pack 3. memcpy( %p, %p, %lu ) => space %lu [epilog]\n" ,
516+ (void * ) _packed , (void * ) _memory , (unsigned long ) do_now_bytes ,
517+ (unsigned long ) (* (SPACE ) - (_packed - * (packed )))););
518+ master -> pFunctions [_elem -> common .type ](CONVERTOR , cando_count ,
519+ _packed , * SPACE , remote_elem_size ,
520+ _memory , * SPACE , local_elem_size ,
521+ & advance );
522+ _memory += do_now_bytes ;
523+ _packed += do_now_bytes ;
524+ }
525+
526+ update_and_return :
527+ * (memory ) = _memory - _elem -> disp ;
528+ * (SPACE ) -= (_packed - * packed );
529+ * (packed ) = _packed ;
530+ }
531+
452532int32_t opal_unpack_general_function (opal_convertor_t * pConvertor , struct iovec * iov ,
453533 uint32_t * out_size , size_t * max_data )
454534{
@@ -463,9 +543,10 @@ int32_t opal_unpack_general_function(opal_convertor_t *pConvertor, struct iovec
463543 unsigned char * conv_ptr , * iov_ptr ;
464544 uint32_t iov_count ;
465545 size_t iov_len_local ;
466-
546+ #if 0
467547 const opal_convertor_master_t * master = pConvertor -> master ;
468548 ptrdiff_t advance ; /* number of bytes that we should advance the buffer */
549+ #endif
469550 size_t rc ;
470551
471552 DO_DEBUG (opal_output (0 , "opal_convertor_general_unpack( %p, {%p, %lu}, %d )\n" ,
@@ -509,6 +590,9 @@ int32_t opal_unpack_general_function(opal_convertor_t *pConvertor, struct iovec
509590 conv_ptr + pElem -> elem .disp - pConvertor -> pBaseBuf , count_desc ,
510591 description [pos_desc ].elem .extent ,
511592 opal_datatype_basicDatatypes [type ]-> name ););
593+ unpack_predefined_heterogeneous (pConvertor , pElem , & count_desc , & conv_ptr , & iov_ptr ,
594+ & iov_len_local );
595+ #if 0
512596 rc = master -> pFunctions [type ](pConvertor , count_desc , iov_ptr , iov_len_local ,
513597 opal_datatype_basicDatatypes [type ]-> size ,
514598 conv_ptr + pElem -> elem .disp ,
@@ -518,6 +602,7 @@ int32_t opal_unpack_general_function(opal_convertor_t *pConvertor, struct iovec
518602 iov_len_local -= advance ; /* decrease the available space in the buffer */
519603 iov_ptr += advance ; /* increase the pointer to the buffer */
520604 count_desc -= rc ; /* compute leftovers */
605+ #endif
521606 if (0 == count_desc ) { /* completed */
522607 conv_ptr = pConvertor -> pBaseBuf + pStack -> disp ;
523608 pos_desc ++ ; /* advance to the next data */
@@ -527,16 +612,17 @@ int32_t opal_unpack_general_function(opal_convertor_t *pConvertor, struct iovec
527612 }
528613 continue ;
529614 }
615+ #if 0
530616 conv_ptr += rc * description [pos_desc ].elem .extent ;
617+ #endif
531618 assert (pElem -> elem .common .type < OPAL_DATATYPE_MAX_PREDEFINED );
532619 assert (0 == iov_len_local );
533620 if (0 != iov_len_local ) {
534621 unsigned char * temp = conv_ptr ;
535622 /* We have some partial data here. Let's copy it into the convertor
536623 * and keep it hot until the next round.
537624 */
538- assert (iov_len_local
539- < opal_datatype_basicDatatypes [pElem -> elem .common .type ]-> size );
625+ assert (iov_len_local < opal_datatype_basicDatatypes [pElem -> elem .common .type ]-> size );
540626 COMPUTE_CSUM (iov_ptr , iov_len_local , pConvertor );
541627
542628 opal_unpack_partial_datatype (pConvertor , pElem , iov_ptr , 0 , iov_len_local ,
0 commit comments