@@ -37,7 +37,7 @@ unpack_predefined_data( opal_convertor_t* CONVERTOR,
3737 const ddt_elem_desc_t * _elem = & ((ELEM )-> elem );
3838 size_t cando_count = (* SPACE ) / opal_datatype_basicDatatypes [_elem -> common .type ]-> size ;
3939 size_t do_now , do_now_bytes ;
40- size_t blocklen_bytes = _elem -> blocklen * opal_datatype_basicDatatypes [_elem -> common .type ]-> size ;
40+ size_t blocklen_bytes = opal_datatype_basicDatatypes [_elem -> common .type ]-> size ;
4141 unsigned char * _memory = (* memory ) + _elem -> disp ;
4242 unsigned char * _packed = * packed ;
4343
@@ -46,6 +46,21 @@ unpack_predefined_data( opal_convertor_t* CONVERTOR,
4646 if ( cando_count > * (COUNT ) )
4747 cando_count = * (COUNT );
4848
49+ if ( 1 == _elem -> blocklen ) { /* Do as many full blocklen as possible */
50+ * (COUNT ) -= cando_count ;
51+ for (; cando_count > 0 ; cando_count -- ) {
52+ OPAL_DATATYPE_SAFEGUARD_POINTER ( _memory , blocklen_bytes , (CONVERTOR )-> pBaseBuf ,
53+ (CONVERTOR )-> pDesc , (CONVERTOR )-> count );
54+ DO_DEBUG ( opal_output ( 0 , "unpack 2. memcpy( %p, %p, %lu ) => space %lu\n" ,
55+ (void * )_memory , (void * )_packed , (unsigned long )blocklen_bytes , (unsigned long )(* (SPACE ) - (_packed - * (packed ))) ); );
56+ MEMCPY_CSUM ( _memory , _packed , blocklen_bytes , (CONVERTOR ) );
57+ _packed += blocklen_bytes ;
58+ _memory += _elem -> extent ;
59+ }
60+ goto update_and_return ;
61+ }
62+ blocklen_bytes *= _elem -> blocklen ;
63+
4964 /**
5065 * First check if we already did something on this element ? The COUNT is the number
5166 * of remaining predefined types in the current elem, not how many predefined types
@@ -92,14 +107,15 @@ unpack_predefined_data( opal_convertor_t* CONVERTOR,
92107 assert ( cando_count < _elem -> blocklen );
93108 do_now_bytes = cando_count * opal_datatype_basicDatatypes [_elem -> common .type ]-> size ;
94109 OPAL_DATATYPE_SAFEGUARD_POINTER ( _memory , do_now_bytes , (CONVERTOR )-> pBaseBuf ,
95- (CONVERTOR )-> pDesc , (CONVERTOR )-> count );
110+ (CONVERTOR )-> pDesc , (CONVERTOR )-> count );
96111 DO_DEBUG ( opal_output ( 0 , "unpack 3. memcpy( %p, %p, %lu ) => space %lu [epilog]\n" ,
97112 (void * )_memory , (void * )_packed , (unsigned long )do_now_bytes , (unsigned long )(* (SPACE ) - (_packed - * (packed ))) ); );
98113 MEMCPY_CSUM ( _memory , _packed , do_now_bytes , (CONVERTOR ) );
99114 _memory += do_now_bytes ;
100115 _packed += do_now_bytes ;
101116 }
102117
118+ update_and_return :
103119 * (memory ) = _memory - _elem -> disp ;
104120 * (SPACE ) -= (_packed - * packed );
105121 * (packed ) = _packed ;
0 commit comments