Repository: incubator-systemml Updated Branches: refs/heads/master 354ec0217 -> 28467c3fe
[SYSTEMML-410] Fix UpdateInPlace intermediate candidate Project: http://git-wip-us.apache.org/repos/asf/incubator-systemml/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-systemml/commit/28467c3f Tree: http://git-wip-us.apache.org/repos/asf/incubator-systemml/tree/28467c3f Diff: http://git-wip-us.apache.org/repos/asf/incubator-systemml/diff/28467c3f Branch: refs/heads/master Commit: 28467c3fea6b8ed86ecfdc7d321bbd2390745010 Parents: 354ec02 Author: Arvind Surve <[email protected]> Authored: Mon Mar 7 12:05:56 2016 -0800 Committer: Arvind Surve <[email protected]> Committed: Mon Mar 7 12:05:56 2016 -0800 ---------------------------------------------------------------------- .../java/org/apache/sysml/hops/DataGenOp.java | 3 +- .../apache/sysml/hops/recompile/Recompiler.java | 2 +- .../parfor/opt/OptimizerConstrained.java | 4 +- .../parfor/opt/OptimizerRuleBased.java | 99 +++++++++++++++----- .../instructions/cp/VariableCPInstruction.java | 3 +- .../java/org/apache/sysml/utils/Explain.java | 4 +- .../java/org/apache/sysml/utils/Statistics.java | 16 ++++ .../updateinplace/UpdateInPlaceTest.java | 48 ++++++---- .../functions/updateinplace/updateinplace10.dml | 2 + 9 files changed, 130 insertions(+), 51 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/28467c3f/src/main/java/org/apache/sysml/hops/DataGenOp.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/hops/DataGenOp.java b/src/main/java/org/apache/sysml/hops/DataGenOp.java index c8d7fc4..c584d9c 100644 --- a/src/main/java/org/apache/sysml/hops/DataGenOp.java +++ b/src/main/java/org/apache/sysml/hops/DataGenOp.java @@ -168,7 +168,8 @@ public class DataGenOp extends Hop implements MultiThreadedHop (getRowsInBlock()>0)?getRowsInBlock():DMLTranslator.DMLBlockSize, (getColsInBlock()>0)?getColsInBlock():DMLTranslator.DMLBlockSize, //actual rand nnz might differ (in cp/mr they are corrected after execution) - (_op==DataGenMethod.RAND && et==ExecType.SPARK && getNnz()!=0) ? -1 : getNnz() ); + (_op==DataGenMethod.RAND && et==ExecType.SPARK && getNnz()!=0) ? -1 : getNnz(), + getUpdateInPlace()); setLineNumbers(rnd); setLops(rnd); http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/28467c3f/src/main/java/org/apache/sysml/hops/recompile/Recompiler.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/hops/recompile/Recompiler.java b/src/main/java/org/apache/sysml/hops/recompile/Recompiler.java index 0f2add5..aa0eb03 100644 --- a/src/main/java/org/apache/sysml/hops/recompile/Recompiler.java +++ b/src/main/java/org/apache/sysml/hops/recompile/Recompiler.java @@ -905,7 +905,7 @@ public class Recompiler } - + /** * * @param oldCallVars http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/28467c3f/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 3c67bd7..5f3fb75 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 @@ -162,7 +162,7 @@ public class OptimizerConstrained extends OptimizerRuleBased //rewrite 14: HashSet<String> inplaceResultVars = new HashSet<String>(); - super.rewriteSetInPlaceResultIndexing(pn, M1, ec.getVariables(), inplaceResultVars); + super.rewriteSetInPlaceResultIndexing(pn, M1, ec.getVariables(), inplaceResultVars, ec); //rewrite 15: super.rewriteDisableCPCaching(pn, inplaceResultVars, ec.getVariables()); @@ -178,7 +178,7 @@ public class OptimizerConstrained extends OptimizerRuleBased // rewrite 14: set in-place result indexing HashSet<String> inplaceResultVars = new HashSet<String>(); - super.rewriteSetInPlaceResultIndexing(pn, M1, ec.getVariables(), inplaceResultVars); + super.rewriteSetInPlaceResultIndexing(pn, M1, ec.getVariables(), inplaceResultVars, ec); if( !OptimizerUtils.isSparkExecutionMode() ) { // rewrite 16: runtime piggybacking http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/28467c3f/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 6c4d254..6d17a06 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 @@ -35,6 +35,7 @@ import org.apache.hadoop.fs.Path; import org.apache.sysml.conf.ConfigurationManager; import org.apache.sysml.conf.DMLConfig; import org.apache.sysml.hops.AggBinaryOp; +import org.apache.sysml.hops.DataGenOp; import org.apache.sysml.hops.DataOp; import org.apache.sysml.hops.FunctionOp; import org.apache.sysml.hops.Hop; @@ -101,6 +102,7 @@ import org.apache.sysml.runtime.matrix.MatrixFormatMetaData; import org.apache.sysml.runtime.matrix.data.MatrixBlock; import org.apache.sysml.runtime.matrix.data.OutputInfo; import org.apache.sysml.runtime.matrix.data.SparseRow; +import org.apache.sysml.utils.Explain; import org.apache.sysml.yarn.ropt.YarnClusterAnalyzer; /** @@ -155,7 +157,7 @@ public class OptimizerRuleBased extends Optimizer public static final boolean APPLY_REWRITE_NESTED_PARALLELISM = false; public static final String FUNCTION_UNFOLD_NAMEPREFIX = "__unfold_"; - public static final boolean APPLY_REWRITE_UPDATE_INPLACE_INTERMEDIATE = false; + public static final boolean APPLY_REWRITE_UPDATE_INPLACE_INTERMEDIATE = true; public static final double PAR_K_FACTOR = OptimizationWrapper.PAR_FACTOR_INFRASTRUCTURE; public static final double PAR_K_MR_FACTOR = 1.0 * OptimizationWrapper.PAR_FACTOR_INFRASTRUCTURE; @@ -290,7 +292,7 @@ public class OptimizerRuleBased extends Optimizer // rewrite 14: set in-place result indexing HashSet<String> inplaceResultVars = new HashSet<String>(); - rewriteSetInPlaceResultIndexing(pn, M1, ec.getVariables(), inplaceResultVars); + rewriteSetInPlaceResultIndexing(pn, M1, ec.getVariables(), inplaceResultVars, ec); // rewrite 15: disable caching rewriteDisableCPCaching(pn, inplaceResultVars, ec.getVariables()); @@ -305,7 +307,7 @@ public class OptimizerRuleBased extends Optimizer // rewrite 14: set in-place result indexing HashSet<String> inplaceResultVars = new HashSet<String>(); - rewriteSetInPlaceResultIndexing(pn, M1, ec.getVariables(), inplaceResultVars); + rewriteSetInPlaceResultIndexing(pn, M1, ec.getVariables(), inplaceResultVars, ec); if( !OptimizerUtils.isSparkExecutionMode() ) { // rewrite 16: runtime piggybacking @@ -1863,7 +1865,7 @@ public class OptimizerRuleBased extends Optimizer * @param inPlaceResultVars * @throws DMLRuntimeException */ - protected void rewriteSetInPlaceResultIndexing(OptNode pn, double M, LocalVariableMap vars, HashSet<String> inPlaceResultVars) + protected void rewriteSetInPlaceResultIndexing(OptNode pn, double M, LocalVariableMap vars, HashSet<String> inPlaceResultVars, ExecutionContext ec) throws DMLRuntimeException { //assertions (warnings of corrupt optimizer decisions) @@ -1933,11 +1935,11 @@ public class OptimizerRuleBased extends Optimizer if (uipCandHopList != null) { for (UIPCandidateHop uipCandHop: uipCandHopList) - if(uipCandHop.isLoopApplicable() && uipCandHop.isUpdateInPlace()) + if(uipCandHop.isIntermediate() && uipCandHop.isLoopApplicable() && uipCandHop.isUpdateInPlace()) { uipCandHop.getHop().setUpdateInPlace(true); bAnyUIPApplicable = true; - + if(LOG.isDebugEnabled()) listUIPRes.get().add(uipCandHop.getHop().getName()); } @@ -1945,8 +1947,9 @@ public class OptimizerRuleBased extends Optimizer } if(bAnyUIPApplicable) try { - //Recompile this block if there is any update in place applicable. - Recompiler.recompileProgramBlockInstructions(pfpb); //TODO: Recompile @ very high level ok? + //Recompile this block recursively if there is any update in place applicable. + LocalVariableMap localVaraibleMap = (LocalVariableMap) ec.getVariables().clone(); + Recompiler.recompileProgramBlockHierarchy(pfpb.getChildBlocks(), localVaraibleMap, 0L, true); } catch(Exception ex){ throw new DMLRuntimeException(ex); @@ -1956,7 +1959,9 @@ public class OptimizerRuleBased extends Optimizer if(APPLY_REWRITE_UPDATE_INPLACE_INTERMEDIATE && LOG.isTraceEnabled()) { - LOG.trace("UpdateInPlace = " + apply + " for lines between " + pn.getBeginLine() + " and " + pn.getEndLine()); + LOG.trace("UpdateInPlace = " + apply + " for lines between " + pn.getBeginLine() + " and " + pn.getEndLine() + + " for " + uipCandHopHM.size() + " intermediate matrix objects:" + uipCandHopHM.keySet().toString()); + for(Entry<String, ArrayList <UIPCandidateHop>> entry: uipCandHopHM.entrySet()) { ArrayList <UIPCandidateHop> uipCandHopList = entry.getValue(); @@ -1964,8 +1969,18 @@ public class OptimizerRuleBased extends Optimizer if (uipCandHopList != null) { for (UIPCandidateHop uipCandHop: uipCandHopList) { - LOG.trace("Matrix Object: Name: " + uipCandHop.getHop().getName() + "<" + uipCandHop.getHop().getBeginLine() + "," + uipCandHop.getHop().getEndLine()+ ">, InLoop:" - + uipCandHop.isLoopApplicable() + ", UIPApplicable:" + uipCandHop.isUpdateInPlace() + ", HopUIPApplicable:" + uipCandHop.getHop().getUpdateInPlace()); + if(uipCandHop.getHop() != null) + { + LOG.trace("Matrix Object: Name: " + uipCandHop.getHop().getName() + "<" + uipCandHop.getHop().getBeginLine() + "," + uipCandHop.getHop().getEndLine()+ ">, InLoop:" + + uipCandHop.isLoopApplicable() + ", UIPApplicable:" + uipCandHop.isUpdateInPlace() + ", HopUIPApplicable:" + uipCandHop.getHop().getUpdateInPlace()); + LOG.trace("Explain Candidate HOP after recompile"); + LOG.trace(Explain.explain(uipCandHop.getHop())); + } + else + { + LOG.trace("Matrix Object: Name: " + uipCandHop.getLixHop().getName() + "<" + uipCandHop.getLixHop().getBeginLine() + "," + uipCandHop.getLixHop().getEndLine()+ ">, InLoop:" + + uipCandHop.isLoopApplicable() + ", Not an Intermediate matrix object"); + } } } } @@ -2024,7 +2039,7 @@ public class OptimizerRuleBased extends Optimizer { rIsInLoop(pn, uipCandHopHM, false); - // Prune candidate list based on non-existance of candidate in the loop + // Prune candidate list based on non-existance of intermediate candidate in the loop Iterator<Map.Entry<String, ArrayList <UIPCandidateHop>>> uipCandHopHMIter = uipCandHopHM.entrySet().iterator(); while(uipCandHopHMIter.hasNext()) { @@ -2035,12 +2050,18 @@ public class OptimizerRuleBased extends Optimizer for (Iterator<UIPCandidateHop> uipCandHopListIter = uipCandHopList.iterator(); uipCandHopListIter.hasNext();) { UIPCandidateHop uipCandHop = uipCandHopListIter.next(); - if (!uipCandHop.isLoopApplicable()) //If Loop is not applicable then remove it from the list. + if (!uipCandHop.isIntermediate() || !uipCandHop.isLoopApplicable()) //If Loop is not applicable then remove it from the list. { uipCandHopListIter.remove(); if(LOG.isTraceEnabled()) - LOG.trace("Matrix Object: Name: " + uipCandHop.getHop().getName() + "<" + uipCandHop.getHop().getBeginLine() + "," + uipCandHop.getHop().getEndLine()+ - ">, removed from the candidate list as it does not have loop criteria applicable."); + { + if (!uipCandHop.isIntermediate()) + LOG.trace("Matrix Object: Name: " + uipCandHop.getLixHop().getName() + "<" + uipCandHop.getLixHop().getBeginLine() + "," + uipCandHop.getLixHop().getEndLine()+ + ">, removed from the candidate list as it is not an intermediate matrix object."); + else + LOG.trace("Matrix Object: Name: " + uipCandHop.getLixHop().getName() + "<" + uipCandHop.getLixHop().getBeginLine() + "," + uipCandHop.getLixHop().getEndLine()+ + ">, removed from the candidate list as it does not have loop criteria applicable."); + } } } if(uipCandHopList.isEmpty()) @@ -2074,7 +2095,7 @@ public class OptimizerRuleBased extends Optimizer { uipCandHopListIter.remove(); if(LOG.isTraceEnabled()) - LOG.trace("Matrix Object: Name: " + uipCandHop.getHop().getName() + "<" + uipCandHop.getHop().getBeginLine() + "," + uipCandHop.getHop().getEndLine()+ + LOG.trace("Matrix Object: Name: " + uipCandHop.getLixHop().getName() + "<" + uipCandHop.getLixHop().getBeginLine() + "," + uipCandHop.getLixHop().getEndLine()+ ">, removed from the candidate list as one of the consumer is FunctionOp."); break; } @@ -2135,7 +2156,7 @@ public class OptimizerRuleBased extends Optimizer rIsInLoop(optNode, uipCandHopHM, bLoop); } } - else if(bInLoop) + else { Hop hop = (Hop) OptTreeConverter.getAbstractPlanMapping().getMappedHop(pn.getID()); @@ -2147,8 +2168,16 @@ public class OptimizerRuleBased extends Optimizer { for (UIPCandidateHop uipCandHop: uipCandHopList) { + //Identify where intermediate object has been defined. + if (hop instanceof DataGenOp && hop.getName().equals(uipCandHop.getLixHop().getName())) + { + uipCandHop.setHop(hop); + uipCandHop.setLocation(hop.getBeginLine()); + uipCandHop.setIntermediate(true); + } + //Update if candiate hop defined outside this loop, and leftindexing is within this loop. - if (uipCandHop.getLocation() <= hop.getBeginLine() && uipCandHop.getHop().getBeginLine() <= hop.getEndLine()) + if ((bInLoop) && (uipCandHop.getLocation() <= hop.getBeginLine() && uipCandHop.getLixHop().getBeginLine() <= hop.getEndLine())) uipCandHop.setIsLoopApplicable(true); } } @@ -2725,8 +2754,8 @@ public class OptimizerRuleBased extends Optimizer uipCandidateHM.put(uipCandiateID, uipCandiHopList); StatementBlock sb = (StatementBlock) OptTreeConverter.getAbstractPlanMapping().getMappedProg(OptTreeConverter.getAbstractPlanMapping().getMappedParentID(n.getID()))[0]; - if(LOG.isDebugEnabled()) - LOG.debug("Candidate Hop:" + h.getName() + "<" + h.getBeginLine() + "," + h.getEndLine() + ">,<" + + if(LOG.isTraceEnabled()) + LOG.trace("Candidate Hop:" + h.getName() + "<" + h.getBeginLine() + "," + h.getEndLine() + ">,<" + h.getBeginColumn() + "," + h.getEndColumn() + "> PB:" + "<" + pb.getBeginLine() + "," + pb.getEndLine() + ">,<" + pb.getBeginColumn() + "," + pb.getEndColumn() + "> SB:" + "<" + sb.getBeginLine() + "," + sb.getEndLine() + ">,<" + sb.getBeginColumn() + "," + sb.getEndColumn() + ">"); @@ -3894,22 +3923,32 @@ public class OptimizerRuleBased extends Optimizer * as location, flag to indicate if its in loop (for, parfor, while), flag to indicate if hop can be marked as "UpdateInPlace". */ class UIPCandidateHop { - Hop hop; + Hop hopCandidate, hopLix; int iLocation = -1; ProgramBlock pb; - Boolean bIsLoopApplicable = false, bUpdateInPlace = true; + Boolean bIntermediate = false, bIsLoopApplicable = false, bUpdateInPlace = true; ArrayList<Hop> consumerHops = null; - UIPCandidateHop(Hop hop, ProgramBlock pb) + UIPCandidateHop(Hop hopLix, ProgramBlock pb) { - this.hop = hop; + this.hopLix = hopLix; this.pb = pb; } + Hop getLixHop() + { + return hopLix; + } + Hop getHop() { - return hop; + return hopCandidate; + } + + void setHop(Hop hopCandidate) + { + this.hopCandidate = hopCandidate; } ProgramBlock getProgramBlock() @@ -3927,6 +3966,16 @@ public class OptimizerRuleBased extends Optimizer this.iLocation = iLocation; } + boolean isIntermediate() + { + return(bIntermediate); + } + + void setIntermediate(boolean bIntermediate) + { + this.bIntermediate = bIntermediate; + } + boolean isLoopApplicable() { return(bIsLoopApplicable); http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/28467c3f/src/main/java/org/apache/sysml/runtime/instructions/cp/VariableCPInstruction.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/VariableCPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/VariableCPInstruction.java index 22bd2ab..dac114b 100644 --- a/src/main/java/org/apache/sysml/runtime/instructions/cp/VariableCPInstruction.java +++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/VariableCPInstruction.java @@ -22,6 +22,7 @@ package org.apache.sysml.runtime.instructions.cp; import java.io.IOException; import org.apache.commons.lang.StringUtils; +import org.apache.sysml.api.DMLScript; import org.apache.sysml.lops.Lop; import org.apache.sysml.lops.UnaryCP; import org.apache.sysml.parser.Expression.DataType; @@ -446,7 +447,7 @@ public class VariableCPInstruction extends CPInstruction mobj.setFileFormatProperties(formatProperties); mobj.enableUpdateInPlace(updateInPlace); ec.setVariable(input1.getName(), mobj); - if(updateInPlace) + if(DMLScript.STATISTICS && updateInPlace) Statistics.incrementTotalUIPVar(); } else if ( input1.getDataType() == DataType.SCALAR ){ http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/28467c3f/src/main/java/org/apache/sysml/utils/Explain.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/utils/Explain.java b/src/main/java/org/apache/sysml/utils/Explain.java index 1986265..c070378 100644 --- a/src/main/java/org/apache/sysml/utils/Explain.java +++ b/src/main/java/org/apache/sysml/utils/Explain.java @@ -28,9 +28,7 @@ import java.util.Map.Entry; import org.apache.sysml.api.DMLException; import org.apache.sysml.hops.FunctionOp; import org.apache.sysml.hops.Hop; -import org.apache.sysml.hops.Hop.DataOpTypes; import org.apache.sysml.hops.Hop.VisitStatus; -import org.apache.sysml.hops.DataOp; import org.apache.sysml.hops.HopsException; import org.apache.sysml.hops.LiteralOp; import org.apache.sysml.hops.OptimizerUtils; @@ -686,7 +684,7 @@ public class Explain + hop.getColsInBlock() + "," + hop.getNnz()); - if (hop instanceof DataOp && ((DataOp)hop).getDataOpType() == DataOpTypes.TRANSIENTREAD && hop.getUpdateInPlace()) + if (hop.getUpdateInPlace()) sb.append("," + hop.getUpdateInPlace()); sb.append("]"); http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/28467c3f/src/main/java/org/apache/sysml/utils/Statistics.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/utils/Statistics.java b/src/main/java/org/apache/sysml/utils/Statistics.java index ce133ff..a517136 100644 --- a/src/main/java/org/apache/sysml/utils/Statistics.java +++ b/src/main/java/org/apache/sysml/utils/Statistics.java @@ -159,14 +159,26 @@ public class Statistics iNoOfCompiledSPInst ++; } + public static long getTotalUIPVar() { + return lTotalUIPVar.get(); + } + public static void incrementTotalUIPVar() { lTotalUIPVar.incrementAndGet(); } + public static long getTotalLixUIP() { + return lTotalLixUIP.get(); + } + public static void incrementTotalLixUIP() { lTotalLixUIP.incrementAndGet(); } + public static long getTotalLix() { + return lTotalLix.get(); + } + public static void incrementTotalLix() { lTotalLix.incrementAndGet(); } @@ -320,6 +332,10 @@ public class Statistics parforInitTime = 0; parforMergeTime = 0; + lTotalLix.set(0); + lTotalLixUIP.set(0); + lTotalUIPVar.set(0); + resetJITCompileTime(); resetJVMgcTime(); resetJVMgcCount(); http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/28467c3f/src/test/java/org/apache/sysml/test/integration/functions/updateinplace/UpdateInPlaceTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/sysml/test/integration/functions/updateinplace/UpdateInPlaceTest.java b/src/test/java/org/apache/sysml/test/integration/functions/updateinplace/UpdateInPlaceTest.java index 503a42f..062a680 100644 --- a/src/test/java/org/apache/sysml/test/integration/functions/updateinplace/UpdateInPlaceTest.java +++ b/src/test/java/org/apache/sysml/test/integration/functions/updateinplace/UpdateInPlaceTest.java @@ -29,6 +29,7 @@ import org.apache.sysml.runtime.controlprogram.parfor.opt.OptimizerRuleBased; import org.apache.sysml.test.integration.AutomatedTestBase; import org.apache.sysml.test.integration.TestConfiguration; import org.apache.sysml.test.utils.TestUtils; +import org.apache.sysml.utils.Statistics; public class UpdateInPlaceTest extends AutomatedTestBase { @@ -101,13 +102,12 @@ public class UpdateInPlaceTest extends AutomatedTestBase addTestConfiguration(TEST_NAME, new TestConfiguration(TEST_CLASS_DIR, TEST_NAME, null)); } - //public void testUIPOverlapStatement(1) @Test public void testUIP() { List<String> listUIPRes = Arrays.asList("A"); - runUpdateInPlaceTest(TEST_NAME, 1, listUIPRes); + runUpdateInPlaceTest(TEST_NAME, 1, listUIPRes, 2, 4, 4); } @Test @@ -115,7 +115,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase { List<String> listUIPRes = Arrays.asList(); - runUpdateInPlaceTest(TEST_NAME, 2, listUIPRes); + runUpdateInPlaceTest(TEST_NAME, 2, listUIPRes, 0, 0, 4); } @Test @@ -123,7 +123,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase { List<String> listUIPRes = Arrays.asList(); - runUpdateInPlaceTest(TEST_NAME, 3, listUIPRes); + runUpdateInPlaceTest(TEST_NAME, 3, listUIPRes, 0, 0, 4); } @Test @@ -131,7 +131,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase { List<String> listUIPRes = Arrays.asList("A"); - runUpdateInPlaceTest(TEST_NAME, 4, listUIPRes); + runUpdateInPlaceTest(TEST_NAME, 4, listUIPRes, 2, 4, 4); } @Test @@ -139,7 +139,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase { List<String> listUIPRes = Arrays.asList(); - runUpdateInPlaceTest(TEST_NAME, 5, listUIPRes); + runUpdateInPlaceTest(TEST_NAME, 5, listUIPRes, 0, 0, 4); } @Test @@ -147,7 +147,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase { List<String> listUIPRes = Arrays.asList(); - runUpdateInPlaceTest(TEST_NAME, 6, listUIPRes); + runUpdateInPlaceTest(TEST_NAME, 6, listUIPRes, 0, 0, 4); } @Test @@ -155,7 +155,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase { List<String> listUIPRes = Arrays.asList(); - runUpdateInPlaceTest(TEST_NAME, 7, listUIPRes); + runUpdateInPlaceTest(TEST_NAME, 7, listUIPRes, 0, 0, 4); } @Test @@ -163,7 +163,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase { List<String> listUIPRes = Arrays.asList(); - runUpdateInPlaceTest(TEST_NAME, 8, listUIPRes); + runUpdateInPlaceTest(TEST_NAME, 8, listUIPRes, 0, 0, 4); } @Test @@ -171,7 +171,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase { List<String> listUIPRes = Arrays.asList(); - runUpdateInPlaceTest(TEST_NAME, 9, listUIPRes); + runUpdateInPlaceTest(TEST_NAME, 9, listUIPRes, 0, 0, 4); } @Test @@ -179,7 +179,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase { List<String> listUIPRes = Arrays.asList(); - runUpdateInPlaceTest(TEST_NAME, 10, listUIPRes); + runUpdateInPlaceTest(TEST_NAME, 10, listUIPRes, 0, 0, 12); } @Test @@ -187,7 +187,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase { List<String> listUIPRes = Arrays.asList(); - runUpdateInPlaceTest(TEST_NAME, 11, listUIPRes); + runUpdateInPlaceTest(TEST_NAME, 11, listUIPRes, 0, 0, 8); } @Test @@ -195,7 +195,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase { List<String> listUIPRes = Arrays.asList(); - runUpdateInPlaceTest(TEST_NAME, 12, listUIPRes); + runUpdateInPlaceTest(TEST_NAME, 12, listUIPRes, 0, 0, 4); } @Test @@ -203,7 +203,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase { List<String> listUIPRes = Arrays.asList(); - runUpdateInPlaceTest(TEST_NAME, 13, listUIPRes); + runUpdateInPlaceTest(TEST_NAME, 13, listUIPRes, 0, 0, 4); } @Test @@ -211,7 +211,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase { List<String> listUIPRes = Arrays.asList("A"); - runUpdateInPlaceTest(TEST_NAME, 14, listUIPRes); + runUpdateInPlaceTest(TEST_NAME, 14, listUIPRes, 2, 4, 8); } @Test @@ -219,17 +219,16 @@ public class UpdateInPlaceTest extends AutomatedTestBase { List<String> listUIPRes = Arrays.asList(); - runUpdateInPlaceTest(TEST_NAME, 15, listUIPRes); + runUpdateInPlaceTest(TEST_NAME, 15, listUIPRes, 0, 0, 4); } - /** * * @param TEST_NAME * @param iTestNumber * @param listUIPRes */ - private void runUpdateInPlaceTest( String TEST_NAME, int iTestNumber, List<String> listUIPExp ) + private void runUpdateInPlaceTest( String TEST_NAME, int iTestNumber, List<String> listUIPExp, long lTotalUIPVar, long lTotalLixUIP, long lTotalLix) { try { @@ -272,6 +271,19 @@ public class UpdateInPlaceTest extends AutomatedTestBase " does not match with the # of matrix objects " + "0" + " from optimization result.", (listUIPRes == null || listUIPRes.size() == 0)); } + + Assert.assertTrue("Expected # of UpdateInPlace create variables of type matrix " + lTotalUIPVar + + " does not match with the # of UpdateInPlace create variables of type matrix objects " + Statistics.getTotalUIPVar() + " from optimization result.", + (Statistics.getTotalUIPVar() == lTotalUIPVar)); + + Assert.assertTrue("Expected # of UpdateInPlace LeftIndexing " + lTotalLixUIP + + " does not match with the # of UpdateInPlace LeftIndexing " + Statistics.getTotalLixUIP() + " from optimization result.", + (Statistics.getTotalLixUIP() == lTotalLixUIP)); + + Assert.assertTrue("Expected # of total LeftIndexing " + lTotalLix + + " does not match with the # of total LeftIndexing " + Statistics.getTotalLix() + " from optimization result.", + (Statistics.getTotalLix() == lTotalLix)); + } } finally{ http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/28467c3f/src/test/scripts/functions/updateinplace/updateinplace10.dml ---------------------------------------------------------------------- diff --git a/src/test/scripts/functions/updateinplace/updateinplace10.dml b/src/test/scripts/functions/updateinplace/updateinplace10.dml index 936bbfe..0d3a99a 100644 --- a/src/test/scripts/functions/updateinplace/updateinplace10.dml +++ b/src/test/scripts/functions/updateinplace/updateinplace10.dml @@ -31,6 +31,8 @@ parfor (j in 1:m, log=DEBUG){ if(1 == 1) B = A A[i,2] = j*3+i; + if(1 == 1) + B = A A[i,3] = j*4+i; } }
