void Comm_divide(int ngroups, int comm_id, int *new_comm_id) { int i,in,nt,npg,nr; int err; const DDI_Comm *cur_comm = (const DDI_Comm *) Comm_find(comm_id); int *list = (int *) Malloc(ngroups*sizeof(int)); if(ngroups <=0 || ngroups > cur_comm->nn) { fprintf(stdout,"%s: ngroups=%i (arg #1 of DDI_Comm_divide) is invalid.\n",DDI_Id,ngroups); Fatal_error(911); } nt = cur_comm->nn; npg = nt / ngroups; nr = nt % ngroups; for(i=0,in=0; i<ngroups; i++) { list[i] = npg; if(i < nr) list[i]++; } #if defined DDI_BGL if (DDI_BGL_Comm_divide_custom(ngroups, list, comm_id, new_comm_id) != 0) { if (cur_comm->me == 0) printf("%s: Groups are not aligned to BG/L psets.\n", DDI_Id()); Comm_divide_custom(ngroups,list,comm_id,new_comm_id); } #else Comm_divide_custom(ngroups,list,comm_id,new_comm_id); #endif free(list); }
void Comm_divide(int ngroups, int comm_id, int *new_comm_id) { int i,in,nt,npg,nr; const DDI_Comm *cur_comm = (const DDI_Comm *) Comm_find(comm_id); int *list = (int *) Malloc(ngroups*sizeof(int)); if(ngroups <=0 || ngroups > cur_comm->nn) { fprintf(stdout,"%s: ngroups=%i (arg #1 of DDI_Comm_divide) is invalid.\n",DDI_Id,ngroups); Fatal_error(911); } nt = cur_comm->nn; npg = nt / ngroups; nr = nt % ngroups; for(i=0,in=0; i<ngroups; i++) { list[i] = npg; if(i < nr) list[i]++; } Comm_divide_custom(ngroups,list,comm_id,new_comm_id); free(list); }