30 #ifdef __VRB_DIAGNOSTIC__
40 recurseCoordinateVRB(
int dim,
41 const int *strides,
const int* sizes,
const int *offsets,
42 int nprocs,
int firstProc,
int *procs );
74 int *offsets =
new int[dim];
79 int *strides =
new int[dim];
81 for (i=dim-2; i>=0; --i)
82 strides[i] = strides[i+1]*sizes[i+1];
85 recurseCoordinateVRB(dim,strides,sizes,offsets,nprocs,0,procs);
108 assign(
int dim,
const int *strides,
const int *sizes,
const int *offsets,
119 #ifdef __VRB__DIAGNOSTIC__
120 printf(
"---------- assign ----------\n");
121 printf(
"dim=%d, sizes=",dim);
122 for (i=0; i<dim; ++i)
123 printf(
" %d",sizes[i]);
124 printf(
", offsets=");
125 for (i=0; i<dim; ++i)
126 printf(
" %d",offsets[i]);
127 printf(
", strides=");
128 for (i=0; i<dim; ++i)
129 printf(
" %d",strides[i]);
130 printf(
", procs=%lx\n",procs);
131 printf(
"----------------------------\n");
137 for (i=0; i<sizes[0]; ++i)
138 procs[offsets[0]+i] = x;
144 for (i=0; i<sizes[0]; ++i)
145 assign(dim-1,strides+1,sizes+1,offsets+1,x,procs+(offsets[0]+i)*strides[0]);
169 recurseCoordinateVRB(
int dim,
170 const int* strides,
const int* sizes,
const int *offsets,
171 int nprocs,
int firstProc,
int *procs )
179 for (
int i=0; i<dim; ++i)
185 #ifdef __VRB_DIAGNOSTIC__
186 printf(
"---------- RecurseCoordinateVRB ----------\n");
187 printf(
"dim= %d, sizes=",dim);
188 for (i=0; i<dim; ++i)
189 printf(
" %d",sizes[i]);
190 printf(
", offsets=");
191 for (i=0; i<dim; ++i)
192 printf(
" %d",offsets[i]);
193 printf(
", nprocs= %d, firstProc= %d\n",nprocs,firstProc);
194 printf(
"------------------------------------------\n");
202 assign(dim,strides,sizes,offsets,firstProc,procs);
213 int totalVnodes = sizes[0];
214 for (d=1; d<dim; ++d)
215 totalVnodes *= sizes[d];
219 int leftProcs = nprocs/2;
220 int rightProcs = nprocs-leftProcs;
225 for (d=1; d<dim; ++d)
226 if ( sizes[d] > sizes[splitDim] )
230 int splitSize = sizes[splitDim];
240 double outOfBalance = splitSize/(double)rightProcs;
245 for (d=0; d<dim; ++d)
247 crossSize *= sizes[d];
250 for (
int l=1; l<splitSize; ++l)
253 int r = splitSize - l;
254 double b = l/(double)leftProcs - r/(
double)rightProcs;
264 if ( (b < outOfBalance) &&
265 (l*crossSize>=leftProcs) &&
266 (r*crossSize>=rightProcs) )
281 int *newSizes =
new int[dim];
282 for (d=0; d<dim; ++d)
283 newSizes[d] = sizes[d];
286 int *newOffsets =
new int[dim];
287 for (d=0; d<dim; ++d)
288 newOffsets[d] = offsets[d];
291 newSizes[splitDim] = leftVnodes;
294 recurseCoordinateVRB(dim,strides,newSizes,newOffsets,leftProcs,firstProc,procs);
297 newSizes[splitDim] = splitSize - leftVnodes;
298 newOffsets[splitDim] += leftVnodes;
301 recurseCoordinateVRB(dim,strides,newSizes,newOffsets,rightProcs,firstProc+leftProcs,procs);
305 delete [] newOffsets;
311 #ifdef __VRB_DIAGNOSTIC__
318 print(
int dim,
const int *sizes,
const int *procs)
322 for (
int i=0; i<*sizes; ++i)
323 printf(
"%4d",procs[i]);
329 for (i=1; i<dim; ++i)
331 for (i=0; i<sizes[0]; ++i)
333 print(dim-1,sizes+1,procs+skip*i);
343 main(
int argc,
char *argv[])
350 int nprocs = atoi(argv[1]);
354 int *sizes =
new int[dim];
356 for (
int d = 0; d<dim; ++d )
358 sizes[d] = atoi(argv[d+2]);
359 totalVnodes *= sizes[d];
361 int *procs =
new int[totalVnodes];
367 print(dim,sizes,procs);
int main(int argc, char *argv[])
void assign(const BareField< T, Dim > &a, RHS b, OP op, ExprTag< true >)
void vnodeRecursiveBisection(int dim, const int *sizes, int nprocs, int *procs)