int main() { int ndims=2; int gdims[2]={31,777602}; int num_io_procs=24; bool converged=false; long int start[ndims], kount[ndims]; int iorank, numaiotasks; long int tpsize; long int psize; long int pgdims; int scnt; pgdims=1; for(int i=0;i<ndims;i++) pgdims*=gdims[i]; tpsize = 0; numaiotasks = 0; while (! converged){ for(iorank=0;iorank<num_io_procs;iorank++){ numaiotasks = CalcStartandCount(PIO_DOUBLE,ndims,gdims,num_io_procs, iorank, start,kount); if(iorank<numaiotasks) printf("iorank %d start %ld %ld count %ld %ld\n",iorank,start[0],start[1],kount[0],kount[1]); if(numaiotasks<0) return numaiotasks; psize=1; scnt=0; for(int i=0;i<ndims;i++){ psize*=kount[i]; scnt+=kount[i]; } tpsize+=psize; } if(tpsize==pgdims) converged = true; else{ printf("Failed to converge %ld %ld %d\n",tpsize,pgdims,num_io_procs); tpsize=0; num_io_procs--; } } }
int PIOc_InitDecomp(const int iosysid, const int basetype,const int ndims, const int dims[], const int maplen, const PIO_Offset *compmap, int *ioidp,const int *rearranger, const PIO_Offset *iostart,const PIO_Offset *iocount) { iosystem_desc_t *ios; io_desc_t *iodesc; int mpierr; int ierr; int iosize; int ndisp; for(int i=0;i<ndims;i++){ if(dims[i]<=0){ piodie("Invalid dims argument",__FILE__,__LINE__); } } ios = pio_get_iosystem_from_id(iosysid); if(ios == NULL) return PIO_EBADID; if(PIO_Save_Decomps){ char filename[30]; if(ios->num_comptasks < 100) { sprintf(filename, "piodecomp%2.2dtasks%2.2ddims%2.2d.dat",ios->num_comptasks,ndims,counter); }else if(ios->num_comptasks < 10000) { sprintf(filename, "piodecomp%4.4dtasks%2.2ddims%2.2d.dat",ios->num_comptasks,ndims,counter); }else{ sprintf(filename, "piodecomp%6.6dtasks%2.2ddims%2.2d.dat",ios->num_comptasks,ndims,counter); } PIOc_writemap(filename,ndims,dims,maplen,compmap,ios->comp_comm); counter++; } iodesc = malloc_iodesc(basetype, ndims); if(rearranger == NULL) iodesc->rearranger = ios->default_rearranger; else iodesc->rearranger = *rearranger; if(iodesc->rearranger==PIO_REARR_SUBSET){ if((iostart != NULL) && (iocount != NULL)){ fprintf(stderr,"%s %s\n","Iostart and iocount arguments to PIOc_InitDecomp", "are incompatable with subset rearrange method and will be ignored"); } iodesc->num_aiotasks = ios->num_iotasks; ierr = subset_rearrange_create( *ios, maplen, compmap, dims, ndims, iodesc); }else{ if(ios->ioproc){ // Unless the user specifies the start and count for each IO task compute it. if((iostart != NULL) && (iocount != NULL)){ // printf("iocount[0] = %ld %ld\n",iocount[0], iocount); iodesc->maxiobuflen=1; for(int i=0;i<ndims;i++){ iodesc->firstregion->start[i] = iostart[i]; iodesc->firstregion->count[i] = iocount[i]; compute_maxIObuffersize(ios->io_comm, iodesc); } iodesc->num_aiotasks = ios->num_iotasks; }else{ iodesc->num_aiotasks = CalcStartandCount(basetype, ndims, dims, ios->num_iotasks, ios->io_rank, iodesc->firstregion->start, iodesc->firstregion->count); } compute_maxIObuffersize(ios->io_comm, iodesc); } // Depending on array size and io-blocksize the actual number of io tasks used may vary CheckMPIReturn(MPI_Bcast(&(iodesc->num_aiotasks), 1, MPI_INT, ios->ioroot, ios->my_comm),__FILE__,__LINE__); // Compute the communications pattern for this decomposition if(iodesc->rearranger==PIO_REARR_BOX){ ierr = box_rearrange_create( *ios, maplen, compmap, dims, ndims, iodesc); } /* if(ios->ioproc){ io_region *ioregion = iodesc->firstregion; while(ioregion != NULL){ for(int i=0;i<ndims;i++) printf("%s %d i %d dim %d start %ld count %ld\n",__FILE__,__LINE__,i,dims[i],ioregion->start[i],ioregion->count[i]); ioregion = ioregion->next; } } */ } *ioidp = pio_add_to_iodesc_list(iodesc); performance_tune_rearranger(*ios, iodesc); return PIO_NOERR; }