The file src/mpi/topo/dims_create.c contains the code that determines the result of MPI_DIMS_CREATE It contains a bug which causes it to produce improper distributions of the processes among dimensions that do not satisfy the objective of being "as close to each other as possible". For example, if called in 3-dimensions, with 16 nodes, the topology returned is 4, 4, 1. It ought to be 4, 2, 2. This bug is caused by some longstanding cobbled-together code that is called when all the factors of the nnodes are 2 (which is not an unusual case). I attach (and include below) a patch to correct this bug. It would be great if it could find its way into the distribution. Thanks Ian Hutchinson http://www.psfc.mit.edu/people/hutch/ ========================================================================= --- dims_create.c.dist 2012-12-08 13:46:46.000000000 -0500 +++ dims_create.c 2012-12-08 13:48:02.000000000 -0500 @@ -317,28 +317,22 @@ int cnt = factors[0].cnt; /* Numver of factors left */ int cnteach = ( cnt + dims_needed - 1 ) / dims_needed; int factor_each; - - factor_each = factor; - for (i=1; i<cnteach; i++) factor_each *= factor; - for (i=0; i<ndims; i++) { - if (dims[i] == 0) { - if (cnt > cnteach) { - dims[i] = factor_each; - cnt -= cnteach; - } - else if (cnt > 0) { - factor_each = factor; - for (j=1; j<cnt; j++) - factor_each *= factor; - dims[i] = factor_each; - cnt = 0; - } - else { - dims[i] = 1; - } + for (i=0;i<ndims;i++){ + if(dims[i]==0)dims[i]=-1; + } + i=0; + while(cnt > 0){ + if(dims[i] < 0){ + dims[i]=dims[i]*factor; + cnt--; } + if(++i >= ndims)i=0; + } + for (i=0;i<ndims;i++){ + if(dims[i] < 0)dims[i]=-dims[i]; } + } else { /* Here is the general case. */
participants (1)
-
Ian Hutchinson