@@ -37,7 +37,7 @@ unpack_predefined_data( opal_convertor_t* CONVERTOR,
37
37
const ddt_elem_desc_t * _elem = & ((ELEM )-> elem );
38
38
size_t cando_count = (* SPACE ) / opal_datatype_basicDatatypes [_elem -> common .type ]-> size ;
39
39
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 ;
41
41
unsigned char * _memory = (* memory ) + _elem -> disp ;
42
42
unsigned char * _packed = * packed ;
43
43
@@ -46,6 +46,21 @@ unpack_predefined_data( opal_convertor_t* CONVERTOR,
46
46
if ( cando_count > * (COUNT ) )
47
47
cando_count = * (COUNT );
48
48
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
+
49
64
/**
50
65
* First check if we already did something on this element ? The COUNT is the number
51
66
* of remaining predefined types in the current elem, not how many predefined types
@@ -92,14 +107,15 @@ unpack_predefined_data( opal_convertor_t* CONVERTOR,
92
107
assert ( cando_count < _elem -> blocklen );
93
108
do_now_bytes = cando_count * opal_datatype_basicDatatypes [_elem -> common .type ]-> size ;
94
109
OPAL_DATATYPE_SAFEGUARD_POINTER ( _memory , do_now_bytes , (CONVERTOR )-> pBaseBuf ,
95
- (CONVERTOR )-> pDesc , (CONVERTOR )-> count );
110
+ (CONVERTOR )-> pDesc , (CONVERTOR )-> count );
96
111
DO_DEBUG ( opal_output ( 0 , "unpack 3. memcpy( %p, %p, %lu ) => space %lu [epilog]\n" ,
97
112
(void * )_memory , (void * )_packed , (unsigned long )do_now_bytes , (unsigned long )(* (SPACE ) - (_packed - * (packed ))) ); );
98
113
MEMCPY_CSUM ( _memory , _packed , do_now_bytes , (CONVERTOR ) );
99
114
_memory += do_now_bytes ;
100
115
_packed += do_now_bytes ;
101
116
}
102
117
118
+ update_and_return :
103
119
* (memory ) = _memory - _elem -> disp ;
104
120
* (SPACE ) -= (_packed - * packed );
105
121
* (packed ) = _packed ;
0 commit comments