int ADIOI_Type_create_hindexed_x(int count, const MPI_Count array_of_blocklengths[], const MPI_Aint array_of_displacements[], MPI_Datatype oldtype, MPI_Datatype *newtype) { int i, ret; MPI_Datatype *types; int *blocklens; types = ADIOI_Malloc(count*sizeof(MPI_Datatype)); blocklens = ADIOI_Malloc(count*sizeof(int)); for(i=0; i<count; i++) { blocklens[i] = 1; type_create_contiguous_x(array_of_blocklengths[i], oldtype, &(types[i])); } ret = MPI_Type_create_struct(count, blocklens, array_of_displacements, types, newtype); for (i=0; i< count; i++) MPI_Type_free(&(types[i])); ADIOI_Free(types); ADIOI_Free(blocklens); return ret; }
int ADIOI_Type_create_hindexed_x(int count, const MPI_Count array_of_blocklengths[], const MPI_Aint array_of_displacements[], MPI_Datatype oldtype, MPI_Datatype *newtype) { int i, ret; MPI_Datatype *types; int *blocklens; int is_big=0; types = ADIOI_Malloc(count*sizeof(MPI_Datatype)); blocklens = ADIOI_Malloc(count*sizeof(int)); /* squashing two loops into one. * - Look in the array_of_blocklengths for any large values * - convert MPI_Count items (if they are not too big) into int-sized items * after this loop we will know if we can use MPI_type_hindexed or if we * need a more complicated BigMPI-style struct-of-chunks. * * Why not use the struct-of-chunks in all cases? HDF5 reported a bug, * which I have not yet precicesly nailed down, but appears to have * something to do with struct-of-chunks when the chunks are small */ for(i=0; i<count; i++) { if (array_of_blocklengths[i] > INT_MAX) { blocklens[i] = 1; is_big=1; type_create_contiguous_x(array_of_blocklengths[i], oldtype, &(types[i])); } else { /* OK to cast: checked for "bigness" above */ blocklens[i] = (int)array_of_blocklengths[i]; MPI_Type_contiguous(blocklens[i], oldtype, &(types[i])); } } if (is_big) { ret = MPI_Type_create_struct(count, blocklens, array_of_displacements, types, newtype); } else { ret = MPI_Type_create_hindexed(count, blocklens, array_of_displacements, oldtype, newtype); } for (i=0; i< count; i++) MPI_Type_free(&(types[i])); ADIOI_Free(types); ADIOI_Free(blocklens); return ret; }