Generate more optimal internal data representations.
This commit was SVN r10382.
Этот коммит содержится в:
родитель
58110f9fc9
Коммит
3219b917b9
@ -77,6 +77,7 @@ ompi_ddt_optimize_short( ompi_datatype_t* pData,
|
|||||||
uint16_t last_flags = 0xFFFF; /* keep all for the first datatype */
|
uint16_t last_flags = 0xFFFF; /* keep all for the first datatype */
|
||||||
long total_disp = 0;
|
long total_disp = 0;
|
||||||
int32_t optimized = 0, continuity;
|
int32_t optimized = 0, continuity;
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
pStack = alloca( sizeof(dt_stack_t) * (pData->btypes[DT_LOOP]+2) );
|
pStack = alloca( sizeof(dt_stack_t) * (pData->btypes[DT_LOOP]+2) );
|
||||||
SAVE_STACK( pStack, -1, 0, count, 0, pData->desc.used );
|
SAVE_STACK( pStack, -1, 0, count, 0, pData->desc.used );
|
||||||
@ -179,21 +180,40 @@ ompi_ddt_optimize_short( ompi_datatype_t* pData,
|
|||||||
last_length = 0;
|
last_length = 0;
|
||||||
last_type = DT_LOOP;
|
last_type = DT_LOOP;
|
||||||
}
|
}
|
||||||
if( (2 == loop->items) && (1 == elem->count)
|
if( 2 == loop->items ) { /* small loop */
|
||||||
&& (elem->extent == (long)ompi_ddt_basicDatatypes[elem->common.type]->size) ) {
|
if( (1 == elem->count)
|
||||||
CREATE_ELEM( pElemDesc, elem->common.type, elem->common.flags & ~DT_FLAG_CONTIGUOUS,
|
&& (elem->extent == (long)ompi_ddt_basicDatatypes[elem->common.type]->size) ) {
|
||||||
loop->loops, elem->disp, loop->extent );
|
CREATE_ELEM( pElemDesc, elem->common.type, elem->common.flags & ~DT_FLAG_CONTIGUOUS,
|
||||||
pElemDesc++; nbElems++;
|
loop->loops, elem->disp, loop->extent );
|
||||||
pos_desc += loop->items + 1;
|
pElemDesc++; nbElems++;
|
||||||
changes++; optimized++;
|
pos_desc += loop->items + 1;
|
||||||
} else {
|
changes++; optimized++;
|
||||||
CREATE_LOOP_START( pElemDesc, loop->loops, loop->items, loop->extent, loop->common.flags );
|
goto complete_loop;
|
||||||
pElemDesc++; nbElems++;
|
} else if( (elem->extent * (int32_t)elem->count) == loop->extent ) {
|
||||||
PUSH_STACK( pStack, stack_pos, nbElems, DT_LOOP, loop->loops, total_disp, pos_desc + loop->extent );
|
CREATE_ELEM( pElemDesc, elem->common.type, elem->common.flags,
|
||||||
pos_desc++;
|
loop->loops * elem->count, elem->disp, loop->extent );
|
||||||
DDT_DUMP_STACK( pStack, stack_pos, pData->desc.desc, "advance loops" );
|
pElemDesc++; nbElems++;
|
||||||
|
pos_desc += loop->items + 1;
|
||||||
|
changes++; optimized++;
|
||||||
|
goto complete_loop;
|
||||||
|
} else if( loop->loops < 3 ) {
|
||||||
|
for( i = 0; i < loop->loops; i++ ) {
|
||||||
|
CREATE_ELEM( pElemDesc, elem->common.type, elem->common.flags,
|
||||||
|
elem->count, elem->disp, loop->extent );
|
||||||
|
pElemDesc++; nbElems++;
|
||||||
|
}
|
||||||
|
pos_desc += loop->items + 1;
|
||||||
|
changes += loop->loops; optimized += loop->loops;
|
||||||
|
goto complete_loop;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
CREATE_LOOP_START( pElemDesc, loop->loops, loop->items, loop->extent, loop->common.flags );
|
||||||
|
pElemDesc++; nbElems++;
|
||||||
|
PUSH_STACK( pStack, stack_pos, nbElems, DT_LOOP, loop->loops, total_disp, pos_desc + loop->extent );
|
||||||
|
pos_desc++;
|
||||||
|
DDT_DUMP_STACK( pStack, stack_pos, pData->desc.desc, "advance loops" );
|
||||||
}
|
}
|
||||||
|
complete_loop:
|
||||||
total_disp = pStack->disp; /* update the displacement */
|
total_disp = pStack->disp; /* update the displacement */
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user