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,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;
|
||||||
}
|
}
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user