From e3d2ecce5445499f1d3981ca33467383cbca1abf Mon Sep 17 00:00:00 2001 From: Erik Schnetter Date: Mon, 10 Sep 2012 22:23:44 -0400 Subject: Carpet: Add "balanced" load balancing mechanism Add new load balancing mechanism "balanced". --- Carpet/Carpet/src/Recompose.cc | 88 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) (limited to 'Carpet/Carpet/src/Recompose.cc') diff --git a/Carpet/Carpet/src/Recompose.cc b/Carpet/Carpet/src/Recompose.cc index 3dc3517fe..030ae6f76 100644 --- a/Carpet/Carpet/src/Recompose.cc +++ b/Carpet/Carpet/src/Recompose.cc @@ -27,6 +27,7 @@ #include +#include #include #include #include @@ -1305,6 +1306,8 @@ namespace Carpet { SplitRegionsMaps_Automatic (cctkGH, superregss, regss); } else if (CCTK_EQUALS (processor_topology, "recursive")) { SplitRegionsMaps_Recursively (cctkGH, superregss, regss); + } else if (CCTK_EQUALS (processor_topology, "balanced")) { + SplitRegionsMaps_Balanced (cctkGH, superregss, regss); } else if (CCTK_EQUALS (processor_topology, "manual")) { assert (0); // SplitRegionsMaps_AsSpecified (cctkGH, superregss, regss); @@ -1845,6 +1848,91 @@ namespace Carpet { + void + SplitRegionsMaps_Balanced (cGH const *const cctkGH, + vector >& superregss, + vector >& regss) + { + DECLARE_CCTK_PARAMETERS; + + // Find map numbers + int const nmaps = superregss.size(); + vector map_index(maps, -1); + for (int m=0; m regs; + for (int m=0; m > split_regss; + int const nprocs = CCTK_nProcs(cctkGH); + int const nworkers = nprocs; + balance(regs, split_regss, nworkers, + maximum_imbalance, same_number_of_components_on_each_process); + + // Assign process numbers, and make the tree structure + // inaccessible from the regions + for (int p=0; pis_leaf()); + assert(split_regss.AT(p).AT(c).processors->payload().component == -1); + split_regss.AT(p).AT(c).processors->payload().component = p; + // Set process number in region + split_regss.AT(p).AT(c).processors = NULL; + assert(split_regss.AT(p).AT(c).processor == -1); + split_regss.AT(p).AT(c).processor = p; + } + } + + // Distribute by map, implicitly assigning component numbers + for (int p=0; p