walk_type: handle all remaining MPI1 combiners ({H,}VECTOR and

{H,}INDEXED).  Should now be able to enumerate essentially all MPI1
user-defined types.



git-svn-id: svn://svn.valgrind.org/valgrind/trunk@5722
This commit is contained in:
Julian Seward 2006-03-08 03:54:37 +00:00
parent fe1b35ef4f
commit eea205d222

View File

@ -258,33 +258,33 @@ static void maybeFreeTy ( MPI_Datatype* ty )
/* Half-hearted type-showing function (for debugging). */
static void showTy ( FILE* f, MPI_Datatype ty )
{
if (ty == MPI_DATATYPE_NULL) fprintf(f,"DATATYPE_NULL\n");
else if (ty == MPI_BYTE) fprintf(f,"BYTE\n");
else if (ty == MPI_PACKED) fprintf(f,"PACKED\n");
else if (ty == MPI_CHAR) fprintf(f,"CHAR\n");
else if (ty == MPI_SHORT) fprintf(f,"SHORT\n");
else if (ty == MPI_INT) fprintf(f,"INT\n");
else if (ty == MPI_LONG) fprintf(f,"LONG\n");
else if (ty == MPI_FLOAT) fprintf(f,"FLOAT\n");
else if (ty == MPI_DOUBLE) fprintf(f,"DOUBLE\n");
else if (ty == MPI_LONG_DOUBLE) fprintf(f,"LONG_DOUBLE\n");
else if (ty == MPI_UNSIGNED_CHAR) fprintf(f,"UNSIGNED_CHAR\n");
else if (ty == MPI_UNSIGNED_SHORT) fprintf(f,"UNSIGNED_SHORT\n");
else if (ty == MPI_UNSIGNED_LONG) fprintf(f,"UNSIGNED_LONG\n");
else if (ty == MPI_UNSIGNED) fprintf(f,"UNSIGNED\n");
else if (ty == MPI_FLOAT_INT) fprintf(f,"FLOAT_INT\n");
else if (ty == MPI_DOUBLE_INT) fprintf(f,"DOUBLE_INT\n");
else if (ty == MPI_LONG_DOUBLE_INT) fprintf(f,"LONG_DOUBLE_INT\n");
else if (ty == MPI_LONG_INT) fprintf(f,"LONG_INT\n");
else if (ty == MPI_SHORT_INT) fprintf(f,"SHORT_INT\n");
else if (ty == MPI_2INT) fprintf(f,"2INT\n");
else if (ty == MPI_UB) fprintf(f,"UB\n");
else if (ty == MPI_LB) fprintf(f,"LB\n");
else if (ty == MPI_WCHAR) fprintf(f,"WCHAR\n");
else if (ty == MPI_LONG_LONG_INT) fprintf(f,"LONG_LONG_INT\n");
else if (ty == MPI_LONG_LONG) fprintf(f,"LONG_LONG\n");
else if (ty == MPI_UNSIGNED_LONG_LONG) fprintf(f,"UNSIGNED_LONG_LONG\n");
else fprintf(f,"showTy:???\n");
if (ty == MPI_DATATYPE_NULL) fprintf(f,"DATATYPE_NULL");
else if (ty == MPI_BYTE) fprintf(f,"BYTE");
else if (ty == MPI_PACKED) fprintf(f,"PACKED");
else if (ty == MPI_CHAR) fprintf(f,"CHAR");
else if (ty == MPI_SHORT) fprintf(f,"SHORT");
else if (ty == MPI_INT) fprintf(f,"INT");
else if (ty == MPI_LONG) fprintf(f,"LONG");
else if (ty == MPI_FLOAT) fprintf(f,"FLOAT");
else if (ty == MPI_DOUBLE) fprintf(f,"DOUBLE");
else if (ty == MPI_LONG_DOUBLE) fprintf(f,"LONG_DOUBLE");
else if (ty == MPI_UNSIGNED_CHAR) fprintf(f,"UNSIGNED_CHAR");
else if (ty == MPI_UNSIGNED_SHORT) fprintf(f,"UNSIGNED_SHORT");
else if (ty == MPI_UNSIGNED_LONG) fprintf(f,"UNSIGNED_LONG");
else if (ty == MPI_UNSIGNED) fprintf(f,"UNSIGNED");
else if (ty == MPI_FLOAT_INT) fprintf(f,"FLOAT_INT");
else if (ty == MPI_DOUBLE_INT) fprintf(f,"DOUBLE_INT");
else if (ty == MPI_LONG_DOUBLE_INT) fprintf(f,"LONG_DOUBLE_INT");
else if (ty == MPI_LONG_INT) fprintf(f,"LONG_INT");
else if (ty == MPI_SHORT_INT) fprintf(f,"SHORT_INT");
else if (ty == MPI_2INT) fprintf(f,"2INT");
else if (ty == MPI_UB) fprintf(f,"UB");
else if (ty == MPI_LB) fprintf(f,"LB");
else if (ty == MPI_WCHAR) fprintf(f,"WCHAR");
else if (ty == MPI_LONG_LONG_INT) fprintf(f,"LONG_LONG_INT");
else if (ty == MPI_LONG_LONG) fprintf(f,"LONG_LONG");
else if (ty == MPI_UNSIGNED_LONG_LONG) fprintf(f,"UNSIGNED_LONG_LONG");
else fprintf(f,"showTy:???");
}
/* How big is a "named" (base) type? Returns 0 if not known. Note.
@ -292,7 +292,7 @@ static void showTy ( FILE* f, MPI_Datatype ty )
exact size of one item of the type, NOT the size of it when padded
suitably to make an array of them. In particular that's why the
size of LONG_DOUBLE is 10 and not sizeof(long double), since the
latter is 12 at least on x86. */
latter is 12 at least on x86. Ref: MPI 1.1 doc p18 */
static long sizeofOneNamedTy ( MPI_Datatype ty )
{
if (ty == MPI_DOUBLE) return sizeof(double);
@ -303,6 +303,11 @@ static long sizeofOneNamedTy ( MPI_Datatype ty )
if (ty == MPI_LONG_DOUBLE) return 10; /* NOT: sizeof(long double); */
/* MPI1.1 does not define MPI_LONG_INT, hence the following is a guess */
if (ty == MPI_LONG_INT) return sizeof(signed long int);
if (ty == MPI_BYTE) return 1;
if (ty == MPI_FLOAT) return sizeof(float);
if (ty == MPI_SHORT) return sizeof(signed short int);
if (ty == MPI_UNSIGNED_CHAR) return sizeof(unsigned char);
if (ty == MPI_UNSIGNED_SHORT) return sizeof(unsigned short int);
return 0;
}
@ -381,12 +386,70 @@ void walk_type ( void(*f)(void*,long), char* base, MPI_Datatype ty )
maybeFreeTy( &dtys[0] );
break;
case MPI_COMBINER_VECTOR:
assert(n_ints == 3 && n_addrs == 0 && n_dtys == 1);
ex = extentOfTy(dtys[0]);
if (0)
printf("vector count %d x (bl %d stride %d)\n",
(int)ints[0], (int)ints[1], (int)ints[2]);
for (i = 0; i < ints[0]; i++) {
walk_type_array( f, base + i * ints[2]/*stride*/ * ex,
dtys[0], ints[1]/*blocklength*/ );
}
maybeFreeTy( &dtys[0] );
break;
case MPI_COMBINER_HVECTOR:
assert(n_ints == 2 && n_addrs == 1 && n_dtys == 1);
ex = extentOfTy(dtys[0]);
if (0)
printf("hvector count %d x (bl %d hstride %d)\n",
(int)ints[0], (int)ints[1], (int)addrs[0]);
for (i = 0; i < ints[0]; i++) {
walk_type_array( f, base + i * addrs[0]/*hstride*/,
dtys[0], ints[1]/*blocklength*/ );
}
maybeFreeTy( &dtys[0] );
break;
case MPI_COMBINER_INDEXED:
assert(n_addrs == 0 && n_dtys == 1);
assert(n_ints > 0);
assert(n_ints == 2 * ints[0] + 1);
ex = extentOfTy(dtys[0]);
for (i = 0; i < ints[0]; i++) {
if (0)
printf("indexed (elem %d) off %d copies %d\n",
(int)i, ints[i+1+ints[0]], ints[i+1] );
walk_type_array( f, base + ex * ints[i+1+ints[0]],
dtys[0], ints[i+1] );
}
maybeFreeTy( &dtys[0] );
break;
case MPI_COMBINER_HINDEXED:
assert(n_ints > 0);
assert(n_ints == ints[0] + 1);
assert(n_addrs == ints[0] && n_dtys == 1);
ex = extentOfTy(dtys[0]);
for (i = 0; i < ints[0]; i++) {
if (0)
printf("hindexed (elem %d) hoff %d copies %d\n",
(int)i, (int)addrs[i], ints[i+1] );
walk_type_array( f, base + addrs[i],
dtys[0], ints[i+1] );
}
maybeFreeTy( &dtys[0] );
break;
case MPI_COMBINER_STRUCT:
assert(n_addrs == n_ints-1);
assert(n_dtys == n_ints-1);
assert(n_ints > 0);
assert(n_ints == ints[0] + 1);
for (i = 0; i < ints[0]; i++) {
if (0)
printf("struct (elem %d limit %d) off %d copies %d\n",
printf("struct (elem %d limit %d) hoff %d copies %d\n",
(int)i, (int)ints[0], (int)addrs[i], (int)ints[i+1]);
walk_type_array( f, base + addrs[i], dtys[i], (long)ints[i+1] );
maybeFreeTy( &dtys[i] );
@ -462,6 +525,13 @@ void walk_type_array ( void(*f)(void*,long), char* base,
}
void walk_type_EXTERNALLY_VISIBLE
( void(*f)(void*,long), char* base, MPI_Datatype ty )
{
return walk_type(f, base, ty);
}
/*------------------------------------------------------------*/
/*--- Address-range helpers ---*/
/*------------------------------------------------------------*/
@ -1358,7 +1428,7 @@ UNIMPLEMENTED_WRAPPER(Comm_get_name)
NO_OP_WRAPPER(Comm_group)
UNIMPLEMENTED_WRAPPER(Comm_split)
NO_OP_WRAPPER(Comm_split)
UNIMPLEMENTED_WRAPPER(Comm_test_inter)
UNIMPLEMENTED_WRAPPER(Dims_create)
UNIMPLEMENTED_WRAPPER(Errhandler_create)
@ -1400,7 +1470,7 @@ UNIMPLEMENTED_WRAPPER(Group_range_excl)
UNIMPLEMENTED_WRAPPER(Group_range_incl)
UNIMPLEMENTED_WRAPPER(Group_rank)
UNIMPLEMENTED_WRAPPER(Group_size)
UNIMPLEMENTED_WRAPPER(Group_translate_ranks)
NO_OP_WRAPPER(Group_translate_ranks)
UNIMPLEMENTED_WRAPPER(Group_union)
@ -1453,24 +1523,24 @@ NO_OP_WRAPPER(Type_free)
NO_OP_WRAPPER(Type_get_contents)
NO_OP_WRAPPER(Type_get_envelope)
UNIMPLEMENTED_WRAPPER(Type_get_name)
UNIMPLEMENTED_WRAPPER(Type_create_hindexed)
UNIMPLEMENTED_WRAPPER(Type_create_hvector)
NO_OP_WRAPPER(Type_create_hindexed)
NO_OP_WRAPPER(Type_create_hvector)
//UNIMPLEMENTED_WRAPPER(Type_create_struct)
NO_OP_WRAPPER(Type_create_struct)
UNIMPLEMENTED_WRAPPER(Type_hindexed)
UNIMPLEMENTED_WRAPPER(Type_hvector)
UNIMPLEMENTED_WRAPPER(Type_indexed)
NO_OP_WRAPPER(Type_hindexed)
NO_OP_WRAPPER(Type_hvector)
NO_OP_WRAPPER(Type_indexed)
NO_OP_WRAPPER(Type_lb)
UNIMPLEMENTED_WRAPPER(Type_set_name)
UNIMPLEMENTED_WRAPPER(Type_size)
NO_OP_WRAPPER(Type_size)
//UNIMPLEMENTED_WRAPPER(Type_struct)
NO_OP_WRAPPER(Type_struct)
NO_OP_WRAPPER(Type_ub)
UNIMPLEMENTED_WRAPPER(Type_vector)
NO_OP_WRAPPER(Type_vector)
UNIMPLEMENTED_WRAPPER(Unpack)