Correct the indexed and vector constructor. Mainly take into account the ZERO value for some fields.
Improuve the creation of those datatypes. This commit was SVN r3327.
Этот коммит содержится в:
родитель
62eaa080aa
Коммит
2390f30522
@ -11,10 +11,15 @@ int ompi_ddt_create_indexed( int count, int* pBlockLength, int* pDisp,
|
||||
int i, dLength, endat, disp;
|
||||
long extent = oldType->ub - oldType->lb;
|
||||
|
||||
pdt = ompi_ddt_create( count * (2 + oldType->desc.used) );
|
||||
disp = pDisp[0];
|
||||
dLength = pBlockLength[0];
|
||||
endat = disp + dLength;
|
||||
if( 1 >= count ) {
|
||||
pdt = ompi_ddt_create( oldType->desc.used + 2 );
|
||||
/* multiply by count to make it zero if count is zero */
|
||||
ompi_ddt_add( pdt, oldType, count * dLength, disp * extent, extent );
|
||||
} else {
|
||||
pdt = ompi_ddt_create( count * (2 + oldType->desc.used) );
|
||||
for( i = 1; i < count; i++ ) {
|
||||
if( pBlockLength[i] == 0 ) continue;
|
||||
if( endat == pDisp[i] ) {
|
||||
@ -29,6 +34,7 @@ int ompi_ddt_create_indexed( int count, int* pBlockLength, int* pDisp,
|
||||
}
|
||||
}
|
||||
ompi_ddt_add( pdt, oldType, dLength, disp * extent, extent );
|
||||
}
|
||||
|
||||
*newType = pdt;
|
||||
return OMPI_SUCCESS;
|
||||
@ -46,6 +52,11 @@ int ompi_ddt_create_hindexed( int count, int* pBlockLength, long* pDisp,
|
||||
disp = pDisp[0];
|
||||
dLength = pBlockLength[0];
|
||||
endat = disp + dLength * extent;
|
||||
if( 1 >= count ) {
|
||||
pdt = ompi_ddt_create( oldType->desc.used + 2 );
|
||||
/* multiply by count to make it zero if count is zero */
|
||||
ompi_ddt_add( pdt, oldType, dLength, count * disp, extent );
|
||||
} else {
|
||||
for( i = 1; i < count; i++ ) {
|
||||
if( pBlockLength[i] == 0 ) continue;
|
||||
if( endat == pDisp[i] ) {
|
||||
@ -60,7 +71,7 @@ int ompi_ddt_create_hindexed( int count, int* pBlockLength, long* pDisp,
|
||||
}
|
||||
}
|
||||
ompi_ddt_add( pdt, oldType, dLength, disp, extent );
|
||||
|
||||
}
|
||||
*newType = pdt;
|
||||
return OMPI_SUCCESS;
|
||||
}
|
||||
@ -73,7 +84,8 @@ int ompi_ddt_create_indexed_block( int count, int bLength, int* pDisp,
|
||||
long extent = oldType->ub - oldType->lb;
|
||||
|
||||
if( (count == 0) || (bLength == 0) ) {
|
||||
*newType = ompi_ddt_create(0);
|
||||
*newType = ompi_ddt_create(1);
|
||||
ompi_ddt_add( *newType, oldType, 0, pDisp[0] * extent, extent );
|
||||
return OMPI_SUCCESS;
|
||||
}
|
||||
pdt = ompi_ddt_create( count * (2 + oldType->desc.used) );
|
||||
|
@ -15,26 +15,23 @@ int ompi_ddt_create_vector( int count, int bLength, long stride,
|
||||
long extent = oldType->ub - oldType->lb;
|
||||
dt_desc_t *pTempData, *pData;
|
||||
|
||||
if( bLength == stride ) {
|
||||
/* the elements are contiguous */
|
||||
pData = ompi_ddt_create( oldType->desc.used + 2 );
|
||||
pTempData = ompi_ddt_create( oldType->desc.used + 2 );
|
||||
if( (bLength == stride) || (1 >= count) ) { /* the elements are contiguous */
|
||||
pData = pTempData;
|
||||
ompi_ddt_add( pData, oldType, count * bLength, 0, extent );
|
||||
} else {
|
||||
if( count > 1 ) {
|
||||
if( bLength == 1 ) {
|
||||
pData = ompi_ddt_create( oldType->desc.used + 2 );
|
||||
ompi_ddt_add( pData, oldType, count - 1, 0, stride * extent );
|
||||
if( 1 == bLength ) {
|
||||
pData = pTempData;
|
||||
pTempData = oldType;
|
||||
} else {
|
||||
pTempData = ompi_ddt_create( oldType->desc.used + 2 );
|
||||
pData = ompi_ddt_create( oldType->desc.used + 2 + 2 );
|
||||
ompi_ddt_add( pTempData, oldType, bLength, 0, extent );
|
||||
ompi_ddt_add( pData, pTempData, count - 1, 0, stride * extent );
|
||||
pData = ompi_ddt_create( oldType->desc.used + 2 + 2 );
|
||||
}
|
||||
ompi_ddt_add( pData, pTempData, count, 0, extent * stride );
|
||||
if( 1 != bLength )
|
||||
OBJ_RELEASE( pTempData );
|
||||
}
|
||||
} else {
|
||||
pData = ompi_ddt_create( oldType->desc.used + 2 );
|
||||
}
|
||||
ompi_ddt_add( pData, oldType, bLength, (count - 1) * extent * stride, extent );
|
||||
/* correct the ub to remove the last stride */
|
||||
pData->ub -= (stride - bLength) * extent;
|
||||
}
|
||||
*newType = pData;
|
||||
return OMPI_SUCCESS;
|
||||
@ -46,21 +43,23 @@ int ompi_ddt_create_hvector( int count, int bLength, long stride,
|
||||
long extent = oldType->ub - oldType->lb;
|
||||
dt_desc_t *pTempData, *pData;
|
||||
|
||||
if( (extent * bLength) == stride ) {
|
||||
/* contiguous */
|
||||
pData = ompi_ddt_create( oldType->desc.used + 2 );
|
||||
pTempData = ompi_ddt_create( oldType->desc.used + 2 );
|
||||
if( ((extent * bLength) == stride) || (1 >= count) ) { /* contiguous */
|
||||
pData = pTempData;
|
||||
ompi_ddt_add( pData, oldType, count * bLength, 0, extent );
|
||||
} else {
|
||||
if( count > 1 ) {
|
||||
pTempData = ompi_ddt_create( oldType->desc.used + 2 );
|
||||
pData = ompi_ddt_create( oldType->desc.used + 2 + 2 );
|
||||
ompi_ddt_add( pTempData, oldType, bLength, 0, extent );
|
||||
ompi_ddt_add( pData, pTempData, count - 1, 0, stride );
|
||||
OBJ_RELEASE( pTempData );
|
||||
if( 1 == bLength ) {
|
||||
pData = pTempData;
|
||||
pTempData = oldType;
|
||||
} else {
|
||||
pData = ompi_ddt_create( oldType->desc.used + 2 );
|
||||
ompi_ddt_add( pTempData, oldType, bLength, 0, extent );
|
||||
pData = ompi_ddt_create( oldType->desc.used + 2 + 2 );
|
||||
}
|
||||
ompi_ddt_add( pData, oldType, bLength, (count - 1) * stride, extent );
|
||||
ompi_ddt_add( pData, pTempData, count, 0, stride );
|
||||
if( 1 != bLength )
|
||||
OBJ_RELEASE( pTempData );
|
||||
/* correct the ub to remove the last stride */
|
||||
pData->ub -= (stride - (bLength * extent));
|
||||
}
|
||||
*newType = pData;
|
||||
return OMPI_SUCCESS;
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user