Repository: systemml Updated Branches: refs/heads/master 4e0c7f1c9 -> bfb30b3af
[SYSTEMML-1946] Fix constrained parfor optimizer w/ fixed parallelism This patch fixes the constrained parfor optimizer for the case of a specified parfor degree of parallelism to properly assign the remaining parallelism to nested parfor loops and operations. So far all operations ran at maximum parallelism leading to large CPU over-provisioning, which can severely hurt performance. Project: http://git-wip-us.apache.org/repos/asf/systemml/repo Commit: http://git-wip-us.apache.org/repos/asf/systemml/commit/bfb30b3a Tree: http://git-wip-us.apache.org/repos/asf/systemml/tree/bfb30b3a Diff: http://git-wip-us.apache.org/repos/asf/systemml/diff/bfb30b3a Branch: refs/heads/master Commit: bfb30b3afaa0f88b946e326799cda81754e7bcab Parents: 4e0c7f1 Author: Matthias Boehm <[email protected]> Authored: Sat Oct 7 16:41:02 2017 -0700 Committer: Matthias Boehm <[email protected]> Committed: Sat Oct 7 16:41:02 2017 -0700 ---------------------------------------------------------------------- .../controlprogram/parfor/opt/OptimizerConstrained.java | 7 +++++++ .../runtime/controlprogram/parfor/opt/OptimizerRuleBased.java | 6 +++--- 2 files changed, 10 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/systemml/blob/bfb30b3a/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerConstrained.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerConstrained.java b/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerConstrained.java index 1ca5631..d571a71 100644 --- a/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerConstrained.java +++ b/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerConstrained.java @@ -293,9 +293,16 @@ public class OptimizerConstrained extends OptimizerRuleBased // constraint awareness if( n.getK() > 0 && ConfigurationManager.isParallelParFor() ) { + //set parfor degree of parallelism ParForProgramBlock pfpb = (ParForProgramBlock) OptTreeConverter .getAbstractPlanMapping().getMappedProg(n.getID())[1]; pfpb.setDegreeOfParallelism(n.getK()); + + //distribute remaining parallelism + int remainParforK = getRemainingParallelismParFor(n.getK(), n.getK()); + int remainOpsK = getRemainingParallelismOps(_lkmaxCP, n.getK()); + rAssignRemainingParallelism( n, remainParforK, remainOpsK ); + LOG.debug(getOptMode()+" OPT: forced 'set degree of parallelism' - result=(see EXPLAIN)" ); } else http://git-wip-us.apache.org/repos/asf/systemml/blob/bfb30b3a/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerRuleBased.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerRuleBased.java b/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerRuleBased.java index b80e786..e035f1b 100644 --- a/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerRuleBased.java +++ b/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerRuleBased.java @@ -1258,7 +1258,7 @@ public class OptimizerRuleBased extends Optimizer //distribute remaining parallelism int remainParforK = getRemainingParallelismParFor(kMax, parforK); int remainOpsK = getRemainingParallelismOps(_lkmaxCP, parforK); - rAssignRemainingParallelism( n, remainParforK, remainOpsK ); + rAssignRemainingParallelism( n, remainParforK, remainOpsK ); } else // ExecType.MR/ExecType.SPARK { @@ -1373,12 +1373,12 @@ public class OptimizerRuleBased extends Optimizer } } - private static int getRemainingParallelismParFor(int parforK, int tmpK) { + protected static int getRemainingParallelismParFor(int parforK, int tmpK) { //compute max remaining parfor parallelism k such that k * tmpK <= parforK return (int)Math.ceil((double)(parforK-tmpK+1) / tmpK); } - private static int getRemainingParallelismOps(int opsK, int tmpK) { + protected static int getRemainingParallelismOps(int opsK, int tmpK) { //compute max remaining operations parallelism k with slight over-provisioning //such that k * tmpK <= 1.5 * opsK; note that if parfor already exploits the //maximum parallelism, this will not introduce any over-provisioning.
