You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@systemml.apache.org by mb...@apache.org on 2017/07/18 17:41:40 UTC
systemml git commit: [SYSTEMML-1776] Collapse subsequent assignvar
and rmvar instructions
Repository: systemml
Updated Branches:
refs/heads/master 532da1bc5 -> 4ad8f7742
[SYSTEMML-1776] Collapse subsequent assignvar and rmvar instructions
This patch adds a minor cleanup step to the instruction generation,
which collapses subsequent assignvar and rmvar instructions, in order to
simplify debugging and reduce unnecessary interpretation overhead:
Example: assignvar s1 s2, rmvar s1 -> mvvar s1 s2
Project: http://git-wip-us.apache.org/repos/asf/systemml/repo
Commit: http://git-wip-us.apache.org/repos/asf/systemml/commit/4ad8f774
Tree: http://git-wip-us.apache.org/repos/asf/systemml/tree/4ad8f774
Diff: http://git-wip-us.apache.org/repos/asf/systemml/diff/4ad8f774
Branch: refs/heads/master
Commit: 4ad8f7742e0829998414180d49a4aa5cabc1e669
Parents: 532da1b
Author: Matthias Boehm <mb...@gmail.com>
Authored: Mon Jul 17 22:10:53 2017 -0700
Committer: Matthias Boehm <mb...@gmail.com>
Committed: Mon Jul 17 22:10:53 2017 -0700
----------------------------------------------------------------------
.../java/org/apache/sysml/lops/compile/Dag.java | 51 ++++++++++++++++++++
.../instructions/cp/VariableCPInstruction.java | 26 ++++++----
2 files changed, 68 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/systemml/blob/4ad8f774/src/main/java/org/apache/sysml/lops/compile/Dag.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/lops/compile/Dag.java b/src/main/java/org/apache/sysml/lops/compile/Dag.java
index f108d2f..ddee17d 100644
--- a/src/main/java/org/apache/sysml/lops/compile/Dag.java
+++ b/src/main/java/org/apache/sysml/lops/compile/Dag.java
@@ -24,6 +24,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.Iterator;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -3816,9 +3817,59 @@ public class Dag<N extends Lop>
return false;
}
+ /**
+ * Performs various cleanups on the list of instructions in order to reduce the
+ * number of instructions to simply debugging and reduce interpretation overhead.
+ *
+ * @param insts list of instructions
+ * @return new list of potentially modified instructions
+ * @throws DMLRuntimeException in case of instruction parsing errors
+ */
private static ArrayList<Instruction> cleanupInstructions(ArrayList<Instruction> insts)
throws DMLRuntimeException
{
+ //step 1: create mvvar instructions: assignvar s1 s2, rmvar s1 -> mvvar s1 s2
+ ArrayList<Instruction> tmp1 = collapseAssignvarAndRmvarInstructions(insts);
+
+ //step 2: create packed rmvar instructions: rmvar m1, rmvar m2 -> rmvar m1 m2
+ ArrayList<Instruction> tmp2 = createPackedRmvarInstructions(tmp1);
+
+ return tmp2;
+ }
+
+ private static ArrayList<Instruction> collapseAssignvarAndRmvarInstructions(ArrayList<Instruction> insts)
+ throws DMLRuntimeException
+ {
+ ArrayList<Instruction> ret = new ArrayList<Instruction>();
+ Iterator<Instruction> iter = insts.iterator();
+ while( iter.hasNext() ) {
+ Instruction inst = iter.next();
+ if( iter.hasNext() && inst instanceof VariableCPInstruction
+ && ((VariableCPInstruction)inst).isAssignVariable() ) {
+ VariableCPInstruction inst1 = (VariableCPInstruction) inst;
+ Instruction inst2 = iter.next();
+ if( inst2 instanceof VariableCPInstruction
+ && ((VariableCPInstruction)inst2).isRemoveVariableNoFile()
+ && inst1.getInput1().getName().equals(
+ ((VariableCPInstruction)inst2).getInput1().getName()) ) {
+ ret.add(VariableCPInstruction.prepareMoveInstruction(
+ inst1.getInput1().getName(), inst1.getInput2().getName()));
+ }
+ else {
+ ret.add(inst1);
+ ret.add(inst2);
+ }
+ }
+ else {
+ ret.add(inst);
+ }
+ }
+ return ret;
+ }
+
+ private static ArrayList<Instruction> createPackedRmvarInstructions(ArrayList<Instruction> insts)
+ throws DMLRuntimeException
+ {
ArrayList<Instruction> ret = new ArrayList<Instruction>();
ArrayList<String> currRmVar = new ArrayList<String>();
for( Instruction inst : insts ) {
http://git-wip-us.apache.org/repos/asf/systemml/blob/4ad8f774/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 816d026..3b9ef66 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
@@ -228,6 +228,10 @@ public class VariableCPInstruction extends CPInstruction
|| opcode == VariableOperationCode.RemoveVariableAndFile);
}
+ public boolean isAssignVariable() {
+ return (opcode == VariableOperationCode.AssignVariable);
+ }
+
public FileFormatProperties getFormatProperties() {
return _formatProperties;
}
@@ -707,15 +711,19 @@ public class VariableCPInstruction extends CPInstruction
// get source variable
Data srcData = ec.getVariable(getInput1().getName());
- if ( srcData == null )
- throw new DMLRuntimeException("Unexpected error: could not find a data object for variable name:" + getInput1().getName() + ", while processing instruction " +this.toString());
-
- // remove existing variable bound to target name
- Data tgt = ec.removeVariable(getInput2().getName());
-
- //cleanup matrix data on fs/hdfs (if necessary)
- if ( tgt != null && tgt instanceof MatrixObject ) {
- ec.cleanupMatrixObject((MatrixObject) tgt);
+ if ( srcData == null ) {
+ throw new DMLRuntimeException("Unexpected error: could not find a data object "
+ + "for variable name:" + getInput1().getName() + ", while processing instruction ");
+ }
+
+ if( getInput2().getDataType().isMatrix() ) {
+ // remove existing variable bound to target name
+ Data tgt = ec.removeVariable(getInput2().getName());
+
+ //cleanup matrix data on fs/hdfs (if necessary)
+ if ( tgt != null && tgt instanceof MatrixObject ) {
+ ec.cleanupMatrixObject((MatrixObject) tgt);
+ }
}
// do the actual move