@@ -449,6 +449,86 @@ int32_t opal_generic_simple_unpack_function(opal_convertor_t *pConvertor, struct
449
449
* 1 if everything went fine and the data was completly converted
450
450
* -1 something wrong occurs.
451
451
*/
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
+
452
532
int32_t opal_unpack_general_function (opal_convertor_t * pConvertor , struct iovec * iov ,
453
533
uint32_t * out_size , size_t * max_data )
454
534
{
@@ -463,9 +543,10 @@ int32_t opal_unpack_general_function(opal_convertor_t *pConvertor, struct iovec
463
543
unsigned char * conv_ptr , * iov_ptr ;
464
544
uint32_t iov_count ;
465
545
size_t iov_len_local ;
466
-
546
+ #if 0
467
547
const opal_convertor_master_t * master = pConvertor -> master ;
468
548
ptrdiff_t advance ; /* number of bytes that we should advance the buffer */
549
+ #endif
469
550
size_t rc ;
470
551
471
552
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
509
590
conv_ptr + pElem -> elem .disp - pConvertor -> pBaseBuf , count_desc ,
510
591
description [pos_desc ].elem .extent ,
511
592
opal_datatype_basicDatatypes [type ]-> name ););
593
+ unpack_predefined_heterogeneous (pConvertor , pElem , & count_desc , & conv_ptr , & iov_ptr ,
594
+ & iov_len_local );
595
+ #if 0
512
596
rc = master -> pFunctions [type ](pConvertor , count_desc , iov_ptr , iov_len_local ,
513
597
opal_datatype_basicDatatypes [type ]-> size ,
514
598
conv_ptr + pElem -> elem .disp ,
@@ -518,6 +602,7 @@ int32_t opal_unpack_general_function(opal_convertor_t *pConvertor, struct iovec
518
602
iov_len_local -= advance ; /* decrease the available space in the buffer */
519
603
iov_ptr += advance ; /* increase the pointer to the buffer */
520
604
count_desc -= rc ; /* compute leftovers */
605
+ #endif
521
606
if (0 == count_desc ) { /* completed */
522
607
conv_ptr = pConvertor -> pBaseBuf + pStack -> disp ;
523
608
pos_desc ++ ; /* advance to the next data */
@@ -527,16 +612,17 @@ int32_t opal_unpack_general_function(opal_convertor_t *pConvertor, struct iovec
527
612
}
528
613
continue ;
529
614
}
615
+ #if 0
530
616
conv_ptr += rc * description [pos_desc ].elem .extent ;
617
+ #endif
531
618
assert (pElem -> elem .common .type < OPAL_DATATYPE_MAX_PREDEFINED );
532
619
assert (0 == iov_len_local );
533
620
if (0 != iov_len_local ) {
534
621
unsigned char * temp = conv_ptr ;
535
622
/* We have some partial data here. Let's copy it into the convertor
536
623
* and keep it hot until the next round.
537
624
*/
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 );
540
626
COMPUTE_CSUM (iov_ptr , iov_len_local , pConvertor );
541
627
542
628
opal_unpack_partial_datatype (pConvertor , pElem , iov_ptr , 0 , iov_len_local ,
0 commit comments