diff options
-rw-r--r-- | src/Topology.c | 48 |
1 files changed, 27 insertions, 21 deletions
diff --git a/src/Topology.c b/src/Topology.c index e9b5592..4849ba9 100644 --- a/src/Topology.c +++ b/src/Topology.c @@ -243,7 +243,7 @@ static int FranksTopology(int dim, int max_dir, max_length; int free_procs = total_procs-1; int used_procs = 1; - + int *my_nprocs = (int*)malloc(dim*sizeof(int)); /* Nothing to decompose here */ if (dim == 0) @@ -251,20 +251,11 @@ static int FranksTopology(int dim, return TraditionalTopology(dim, total_procs, nsize, nghostzones, nprocs); } - /* If there are numbers already set up or we have funny grid sizes, - fall back */ - for (i = 0; i < dim; i++) - { - if (nprocs[i] || (nsize[i]<1)) - { - return TraditionalTopology(dim, total_procs, nsize, - nghostzones, nprocs); - } - } + /* start with a single domain */ for (i = 0; i < dim; i++) { - nprocs[i] = 1; + my_nprocs[i] = 1; } /* divide as long as there are processors left */ while (free_procs) @@ -276,13 +267,13 @@ static int FranksTopology(int dim, for (i = 0; i < dim; i++) { /* is one part larger than the max? (then it might be a new max) */ - if ((nsize[i] / nprocs[i] > max_length) && + if ((nsize[i] / my_nprocs[i] > max_length) && /* would there be at least one real point if we divide? */ - (nsize[i] > 2*nghostzones[i]+nprocs[i]) && + (nsize[i] > 2*nghostzones[i]+my_nprocs[i]) && /* do we have enough processors left to divide in this direction? */ - (used_procs/nprocs[i] <= free_procs)) + (used_procs/my_nprocs[i] <= free_procs)) { - max_length = nsize[i] / nprocs[i]; + max_length = nsize[i] / my_nprocs[i]; max_dir = i; } } @@ -291,11 +282,10 @@ static int FranksTopology(int dim, { for (i = 0; i < dim; i++) { - nprocs[i] = 0; + my_nprocs[i] = 0; } CCTK_WARN(CCTK_WARN_COMPLAIN, - "Falling back to the old PUGH topology method, overwriting " - "eventually set manual topologies"); + "Falling back to the old PUGH topology method"); return TraditionalTopology(dim, total_procs, nsize, nghostzones, nprocs); } @@ -303,8 +293,24 @@ static int FranksTopology(int dim, /* note: this is garanteed to decrement at least by one, since the number of used processors is naturally always >= the number of processors used for one dimension */ - free_procs -= used_procs/nprocs[max_dir]; - nprocs[max_dir]++; + free_procs -= used_procs/my_nprocs[max_dir]; + my_nprocs[max_dir]++; + } + /* If there are numbers already set up which are different from what + we arrive at or we have funny grid sizes, fall back */ + for (i = 0; i < dim; i++) + { + if (nprocs[i] && (nprocs[i]!=my_nprocs[i]) || (nsize[i]<1)) + { + CCTK_WARN(CCTK_WARN_COMPLAIN, + "Falling back to the old PUGH topology method"); + return TraditionalTopology(dim, total_procs, nsize, + nghostzones, nprocs); + } + } + for (i = 0; i < dim; i++) + { + nprocs[i] = my_nprocs[i]; } /* success */ return 0; |