From 2390f30522f3fc2ddb17536af761d89802bc1cc3 Mon Sep 17 00:00:00 2001 From: George Bosilca Date: Tue, 26 Oct 2004 06:13:35 +0000 Subject: [PATCH] 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. --- src/datatype/dt_create_indexed.c | 94 ++++++++++++++++++-------------- src/datatype/dt_create_vector.c | 89 +++++++++++++++--------------- 2 files changed, 97 insertions(+), 86 deletions(-) diff --git a/src/datatype/dt_create_indexed.c b/src/datatype/dt_create_indexed.c index 2aa5ab313b..9424beadf5 100644 --- a/src/datatype/dt_create_indexed.c +++ b/src/datatype/dt_create_indexed.c @@ -11,58 +11,69 @@ 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; - for( i = 1; i < count; i++ ) { - if( pBlockLength[i] == 0 ) continue; - if( endat == pDisp[i] ) { - /* contiguous with the previsious */ - 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]; - } + 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] ) { + /* contiguous with the previsious */ + 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; return OMPI_SUCCESS; } 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; - int i, dLength; - long extent = oldType->ub - oldType->lb; - long disp, endat; + dt_desc_t* pdt; + int i, dLength; + long extent = oldType->ub - oldType->lb; + long disp, endat; - pdt = ompi_ddt_create( count * (2 + oldType->desc.used) ); - disp = pDisp[0]; - dLength = pBlockLength[0]; - endat = disp + dLength * extent; - for( i = 1; i < count; i++ ) { - if( pBlockLength[i] == 0 ) continue; - if( endat == pDisp[i] ) { - /* contiguous with the previsious */ - dLength += pBlockLength[i]; - endat += pBlockLength[i] * extent; - } else { - ompi_ddt_add( pdt, oldType, dLength, disp, extent ); - disp = pDisp[i]; - dLength = pBlockLength[i]; - endat = disp + pBlockLength[i] * extent; - } - } - ompi_ddt_add( pdt, oldType, dLength, disp, extent ); - - *newType = pdt; - return OMPI_SUCCESS; + pdt = ompi_ddt_create( count * (2 + oldType->desc.used) ); + 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] ) { + /* contiguous with the previsious */ + dLength += pBlockLength[i]; + endat += pBlockLength[i] * extent; + } else { + ompi_ddt_add( pdt, oldType, dLength, disp, extent ); + disp = pDisp[i]; + dLength = pBlockLength[i]; + endat = disp + pBlockLength[i] * extent; + } + } + 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, @@ -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) ); diff --git a/src/datatype/dt_create_vector.c b/src/datatype/dt_create_vector.c index f4105aa137..da780552db 100644 --- a/src/datatype/dt_create_vector.c +++ b/src/datatype/dt_create_vector.c @@ -10,58 +10,57 @@ */ 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; - dt_desc_t *pTempData, *pData; + 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 ); - 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 ); - } else { - pTempData = ompi_ddt_create( oldType->desc.used + 2 ); - pData = ompi_ddt_create( oldType->desc.used + 2 + 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( 1 == bLength ) { + pData = pTempData; + pTempData = oldType; + } else { 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 ); - } - *newType = pData; - return OMPI_SUCCESS; + /* correct the ub to remove the last stride */ + pData->ub -= (stride - bLength) * extent; + } + *newType = pData; + return OMPI_SUCCESS; } 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; - dt_desc_t *pTempData, *pData; + long extent = oldType->ub - oldType->lb; + dt_desc_t *pTempData, *pData; - if( (extent * bLength) == stride ) { - /* contiguous */ - pData = ompi_ddt_create( oldType->desc.used + 2 ); - 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 ); - } else { - pData = ompi_ddt_create( oldType->desc.used + 2 ); - } - ompi_ddt_add( pData, oldType, bLength, (count - 1) * stride, extent ); - } - *newType = pData; - return OMPI_SUCCESS; + 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( 1 == bLength ) { + pData = pTempData; + pTempData = oldType; + } else { + ompi_ddt_add( pTempData, oldType, bLength, 0, extent ); + pData = ompi_ddt_create( oldType->desc.used + 2 + 2 ); + } + 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; }