1
1

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.
Этот коммит содержится в:
George Bosilca 2004-10-26 06:13:35 +00:00
родитель 62eaa080aa
Коммит 2390f30522
2 изменённых файлов: 97 добавлений и 86 удалений

Просмотреть файл

@ -11,58 +11,69 @@ int ompi_ddt_create_indexed( int count, int* pBlockLength, int* pDisp,
int i, dLength, endat, disp; int i, dLength, endat, disp;
long extent = oldType->ub - oldType->lb; long extent = oldType->ub - oldType->lb;
pdt = ompi_ddt_create( count * (2 + oldType->desc.used) );
disp = pDisp[0]; disp = pDisp[0];
dLength = pBlockLength[0]; dLength = pBlockLength[0];
endat = disp + dLength; endat = disp + dLength;
for( i = 1; i < count; i++ ) { if( 1 >= count ) {
if( pBlockLength[i] == 0 ) continue; pdt = ompi_ddt_create( oldType->desc.used + 2 );
if( endat == pDisp[i] ) { /* multiply by count to make it zero if count is zero */
/* contiguous with the previsious */ ompi_ddt_add( pdt, oldType, count * dLength, disp * extent, extent );
dLength += pBlockLength[i]; } else {
endat += pBlockLength[i]; pdt = ompi_ddt_create( count * (2 + oldType->desc.used) );
} else { for( i = 1; i < count; i++ ) {
ompi_ddt_add( pdt, oldType, dLength, disp * extent, extent ); if( pBlockLength[i] == 0 ) continue;
disp = pDisp[i]; if( endat == pDisp[i] ) {
dLength = pBlockLength[i]; /* contiguous with the previsious */
endat = disp + pBlockLength[i]; dLength += pBlockLength[i];
} endat += pBlockLength[i];
} else {
ompi_ddt_add( pdt, oldType, dLength, disp * extent, extent );
disp = pDisp[i];
dLength = pBlockLength[i];
endat = disp + pBlockLength[i];
}
}
ompi_ddt_add( pdt, oldType, dLength, disp * extent, extent );
} }
ompi_ddt_add( pdt, oldType, dLength, disp * extent, extent );
*newType = pdt; *newType = pdt;
return OMPI_SUCCESS; return OMPI_SUCCESS;
} }
int ompi_ddt_create_hindexed( int count, int* pBlockLength, long* pDisp, int ompi_ddt_create_hindexed( int count, int* pBlockLength, long* pDisp,
dt_desc_t* oldType, dt_desc_t** newType ) dt_desc_t* oldType, dt_desc_t** newType )
{ {
dt_desc_t* pdt; dt_desc_t* pdt;
int i, dLength; int i, dLength;
long extent = oldType->ub - oldType->lb; long extent = oldType->ub - oldType->lb;
long disp, endat; long disp, endat;
pdt = ompi_ddt_create( count * (2 + oldType->desc.used) ); pdt = ompi_ddt_create( count * (2 + oldType->desc.used) );
disp = pDisp[0]; disp = pDisp[0];
dLength = pBlockLength[0]; dLength = pBlockLength[0];
endat = disp + dLength * extent; endat = disp + dLength * extent;
for( i = 1; i < count; i++ ) { if( 1 >= count ) {
if( pBlockLength[i] == 0 ) continue; pdt = ompi_ddt_create( oldType->desc.used + 2 );
if( endat == pDisp[i] ) { /* multiply by count to make it zero if count is zero */
/* contiguous with the previsious */ ompi_ddt_add( pdt, oldType, dLength, count * disp, extent );
dLength += pBlockLength[i]; } else {
endat += pBlockLength[i] * extent; for( i = 1; i < count; i++ ) {
} else { if( pBlockLength[i] == 0 ) continue;
ompi_ddt_add( pdt, oldType, dLength, disp, extent ); if( endat == pDisp[i] ) {
disp = pDisp[i]; /* contiguous with the previsious */
dLength = pBlockLength[i]; dLength += pBlockLength[i];
endat = disp + pBlockLength[i] * extent; endat += pBlockLength[i] * extent;
} } else {
} ompi_ddt_add( pdt, oldType, dLength, disp, extent );
ompi_ddt_add( pdt, oldType, dLength, disp, extent ); disp = pDisp[i];
dLength = pBlockLength[i];
*newType = pdt; endat = disp + pBlockLength[i] * extent;
return OMPI_SUCCESS; }
}
ompi_ddt_add( pdt, oldType, dLength, disp, extent );
}
*newType = pdt;
return OMPI_SUCCESS;
} }
int ompi_ddt_create_indexed_block( int count, int bLength, int* pDisp, int ompi_ddt_create_indexed_block( int count, int bLength, int* pDisp,
@ -73,7 +84,8 @@ int ompi_ddt_create_indexed_block( int count, int bLength, int* pDisp,
long extent = oldType->ub - oldType->lb; long extent = oldType->ub - oldType->lb;
if( (count == 0) || (bLength == 0) ) { 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; return OMPI_SUCCESS;
} }
pdt = ompi_ddt_create( count * (2 + oldType->desc.used) ); pdt = ompi_ddt_create( count * (2 + oldType->desc.used) );

Просмотреть файл

@ -10,58 +10,57 @@
*/ */
int ompi_ddt_create_vector( int count, int bLength, long stride, int ompi_ddt_create_vector( int count, int bLength, long stride,
dt_desc_t* oldType, dt_desc_t** newType ) dt_desc_t* oldType, dt_desc_t** newType )
{ {
long extent = oldType->ub - oldType->lb; long extent = oldType->ub - oldType->lb;
dt_desc_t *pTempData, *pData; dt_desc_t *pTempData, *pData;
if( bLength == stride ) { pTempData = ompi_ddt_create( oldType->desc.used + 2 );
/* the elements are contiguous */ if( (bLength == stride) || (1 >= count) ) { /* the elements are contiguous */
pData = ompi_ddt_create( oldType->desc.used + 2 ); pData = pTempData;
ompi_ddt_add( pData, oldType, count * bLength, 0, extent ); ompi_ddt_add( pData, oldType, count * bLength, 0, extent );
} else { } else {
if( count > 1 ) { if( 1 == bLength ) {
if( bLength == 1 ) { pData = pTempData;
pData = ompi_ddt_create( oldType->desc.used + 2 ); pTempData = oldType;
ompi_ddt_add( pData, oldType, count - 1, 0, stride * extent ); } else {
} 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( 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 ); OBJ_RELEASE( pTempData );
} /* correct the ub to remove the last stride */
} else { pData->ub -= (stride - bLength) * extent;
pData = ompi_ddt_create( oldType->desc.used + 2 ); }
} *newType = pData;
ompi_ddt_add( pData, oldType, bLength, (count - 1) * extent * stride, extent ); return OMPI_SUCCESS;
}
*newType = pData;
return OMPI_SUCCESS;
} }
int ompi_ddt_create_hvector( int count, int bLength, long stride, int ompi_ddt_create_hvector( int count, int bLength, long stride,
dt_desc_t* oldType, dt_desc_t** newType ) dt_desc_t* oldType, dt_desc_t** newType )
{ {
long extent = oldType->ub - oldType->lb; long extent = oldType->ub - oldType->lb;
dt_desc_t *pTempData, *pData; dt_desc_t *pTempData, *pData;
if( (extent * bLength) == stride ) { pTempData = ompi_ddt_create( oldType->desc.used + 2 );
/* contiguous */ if( ((extent * bLength) == stride) || (1 >= count) ) { /* contiguous */
pData = ompi_ddt_create( oldType->desc.used + 2 ); pData = pTempData;
ompi_ddt_add( pData, oldType, count * bLength, 0, extent ); ompi_ddt_add( pData, oldType, count * bLength, 0, extent );
} else { } else {
if( count > 1 ) { if( 1 == bLength ) {
pTempData = ompi_ddt_create( oldType->desc.used + 2 ); pData = pTempData;
pData = ompi_ddt_create( oldType->desc.used + 2 + 2 ); pTempData = oldType;
ompi_ddt_add( pTempData, oldType, bLength, 0, extent ); } else {
ompi_ddt_add( pData, pTempData, count - 1, 0, stride ); ompi_ddt_add( pTempData, oldType, bLength, 0, extent );
OBJ_RELEASE( pTempData ); pData = ompi_ddt_create( oldType->desc.used + 2 + 2 );
} else { }
pData = ompi_ddt_create( oldType->desc.used + 2 ); ompi_ddt_add( pData, pTempData, count, 0, stride );
} if( 1 != bLength )
ompi_ddt_add( pData, oldType, bLength, (count - 1) * stride, extent ); OBJ_RELEASE( pTempData );
} /* correct the ub to remove the last stride */
*newType = pData; pData->ub -= (stride - (bLength * extent));
return OMPI_SUCCESS; }
*newType = pData;
return OMPI_SUCCESS;
} }