Rewrite the subarray strictly following the MPI standard. Set the lb and ub
as it should be. I hope I get it right this time ... This commit was SVN r10293.
Этот коммит содержится в:
родитель
95dd1b173a
Коммит
386a02d2ae
@ -42,8 +42,8 @@ int MPI_Type_create_subarray(int ndims,
|
|||||||
|
|
||||||
{
|
{
|
||||||
MPI_Datatype last_type;
|
MPI_Datatype last_type;
|
||||||
int32_t i, step, end_loop;
|
int32_t i, step, start_loop, end_loop;
|
||||||
int32_t block_length[2], start[2];
|
MPI_Aint size, displ, extent;
|
||||||
|
|
||||||
if (MPI_PARAM_CHECK) {
|
if (MPI_PARAM_CHECK) {
|
||||||
OMPI_ERR_INIT_FINALIZE(FUNC_NAME);
|
OMPI_ERR_INIT_FINALIZE(FUNC_NAME);
|
||||||
@ -67,41 +67,50 @@ int MPI_Type_create_subarray(int ndims,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* If the ndims is zero then return the NULL datatype */
|
/* If the ndims is zero then return the NULL datatype */
|
||||||
if( ndims < 1 ) {
|
if( ndims < 2 ) {
|
||||||
*newtype = &ompi_mpi_datatype_null;
|
if( 0 == ndims ) {
|
||||||
|
*newtype = &ompi_mpi_datatype_null;
|
||||||
|
return MPI_SUCCESS;
|
||||||
|
}
|
||||||
|
ompi_ddt_create_contiguous( subsize_array[0], oldtype, newtype );
|
||||||
return MPI_SUCCESS;
|
return MPI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( MPI_ORDER_C == order ) {
|
if( MPI_ORDER_C == order ) {
|
||||||
i = ndims - 1;
|
start_loop = i = ndims - 1;
|
||||||
step = -1;
|
step = -1;
|
||||||
end_loop = -1;
|
end_loop = -1;
|
||||||
} else {
|
} else {
|
||||||
i = 0;
|
start_loop = i = 0;
|
||||||
step = 1;
|
step = 1;
|
||||||
end_loop = ndims - 1;
|
end_loop = ndims - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ompi_ddt_type_extent( oldtype, &extent );
|
||||||
|
|
||||||
/* As we know that the ndims is at least 1 we can start by creating the first dimension data
|
/* As we know that the ndims is at least 1 we can start by creating the first dimension data
|
||||||
* outside the loop, such that we dont have to create a duplicate of the oldtype just to be able
|
* outside the loop, such that we dont have to create a duplicate of the oldtype just to be able
|
||||||
* to free it.
|
* to free it.
|
||||||
*/
|
*/
|
||||||
block_length[0] = subsize_array[i];
|
ompi_ddt_create_vector( subsize_array[i+step], subsize_array[i], size_array[i],
|
||||||
block_length[1] = 0;
|
oldtype, newtype );
|
||||||
start[0] = start_array[i];
|
|
||||||
start[1] = size_array[i];
|
|
||||||
ompi_ddt_create_indexed( 2, block_length, start, oldtype, newtype );
|
|
||||||
last_type = *newtype;
|
|
||||||
for( i += step; i != end_loop; i += step ) {
|
|
||||||
block_length[0] = subsize_array[i];
|
|
||||||
block_length[1] = 0;
|
|
||||||
start[0] = start_array[i];
|
|
||||||
start[1] = size_array[i];
|
|
||||||
ompi_ddt_create_indexed( 2, block_length, start, last_type, newtype );
|
|
||||||
ompi_ddt_destroy( &last_type );
|
|
||||||
last_type = *newtype;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
last_type = *newtype;
|
||||||
|
size = size_array[i] * size_array[i+step];
|
||||||
|
displ = start_array[i] + start_array[i+step] * size_array[i];
|
||||||
|
for( i += 2 * step; i != end_loop; i += step ) {
|
||||||
|
last_type = *newtype;
|
||||||
|
ompi_ddt_create_vector( subsize_array[i], 1, size_array[i],
|
||||||
|
last_type, newtype );
|
||||||
|
ompi_ddt_destroy( &last_type );
|
||||||
|
displ += size * start_array[i];
|
||||||
|
size *= size_array[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
ompi_ddt_create_resized( last_type, displ * extent,
|
||||||
|
(size - start_array[start_loop]) * extent, newtype );
|
||||||
|
ompi_ddt_destroy( &last_type );
|
||||||
|
|
||||||
{
|
{
|
||||||
int* a_i[5];
|
int* a_i[5];
|
||||||
|
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user