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 2018/05/06 00:36:26 UTC
systemml git commit: [MINOR] Extended compilation chain (optional
function handling)
Repository: systemml
Updated Branches:
refs/heads/master 6d2140224 -> d74ded67c
[MINOR] Extended compilation chain (optional function handling)
Project: http://git-wip-us.apache.org/repos/asf/systemml/repo
Commit: http://git-wip-us.apache.org/repos/asf/systemml/commit/d74ded67
Tree: http://git-wip-us.apache.org/repos/asf/systemml/tree/d74ded67
Diff: http://git-wip-us.apache.org/repos/asf/systemml/diff/d74ded67
Branch: refs/heads/master
Commit: d74ded67cebd4b34323f5e71f5cb5e1e81f6d17f
Parents: 6d21402
Author: Matthias Boehm <mb...@gmail.com>
Authored: Sat May 5 17:37:38 2018 -0700
Committer: Matthias Boehm <mb...@gmail.com>
Committed: Sat May 5 17:37:38 2018 -0700
----------------------------------------------------------------------
.../java/org/apache/sysml/api/DMLScript.java | 2 +-
.../org/apache/sysml/parser/DMLTranslator.java | 148 ++++++++++---------
2 files changed, 78 insertions(+), 72 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/systemml/blob/d74ded67/src/main/java/org/apache/sysml/api/DMLScript.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/api/DMLScript.java b/src/main/java/org/apache/sysml/api/DMLScript.java
index a84f681..c8c2e39 100644
--- a/src/main/java/org/apache/sysml/api/DMLScript.java
+++ b/src/main/java/org/apache/sysml/api/DMLScript.java
@@ -693,7 +693,7 @@ public class DMLScript
//Step 4: construct HOP DAGs (incl LVA, validate, and setup)
DMLTranslator dmlt = new DMLTranslator(prog);
- dmlt.liveVariableAnalysis(prog);
+ dmlt.liveVariableAnalysis(prog);
dmlt.validateParseTree(prog);
dmlt.constructHops(prog);
http://git-wip-us.apache.org/repos/asf/systemml/blob/d74ded67/src/main/java/org/apache/sysml/parser/DMLTranslator.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/parser/DMLTranslator.java b/src/main/java/org/apache/sysml/parser/DMLTranslator.java
index daae07a..45d8fcb 100644
--- a/src/main/java/org/apache/sysml/parser/DMLTranslator.java
+++ b/src/main/java/org/apache/sysml/parser/DMLTranslator.java
@@ -104,38 +104,38 @@ public class DMLTranslator
Recompiler.reinitRecompiler();
}
- /**
- * Validate parse tree
- *
- * @param dmlp dml program
- */
- public void validateParseTree(DMLProgram dmlp)
+ public void validateParseTree(DMLProgram dmlp) {
+ validateParseTree(dmlp, true);
+ }
+
+ public void validateParseTree(DMLProgram dmlp, boolean inclFuns)
{
//STEP1: Pre-processing steps for validate - e.g., prepare read-after-write meta data
boolean fWriteRead = prepareReadAfterWrite(dmlp, new HashMap<String, DataIdentifier>());
//STEP2: Actual Validate
- // handle functions in namespaces (current program has default namespace)
- for (String namespaceKey : dmlp.getNamespaces().keySet()){
-
- // for each function defined in the namespace
- for (String fname : dmlp.getFunctionStatementBlocks(namespaceKey).keySet()) {
- FunctionStatementBlock fblock = dmlp.getFunctionStatementBlock(namespaceKey,fname);
-
- HashMap<String, ConstIdentifier> constVars = new HashMap<>();
- VariableSet vs = new VariableSet();
+ if( inclFuns ) {
+ // handle functions in namespaces (current program has default namespace)
+ for (String namespaceKey : dmlp.getNamespaces().keySet()){
- // add the input variables for the function to input variable list
- FunctionStatement fstmt = (FunctionStatement)fblock.getStatement(0);
- for (DataIdentifier currVar : fstmt.getInputParams()) {
- if (currVar.getDataType() == DataType.SCALAR)
- currVar.setDimensions(0, 0);
- vs.addVariable(currVar.getName(), currVar);
+ // for each function defined in the namespace
+ for (String fname : dmlp.getFunctionStatementBlocks(namespaceKey).keySet()) {
+ FunctionStatementBlock fblock = dmlp.getFunctionStatementBlock(namespaceKey,fname);
+
+ HashMap<String, ConstIdentifier> constVars = new HashMap<>();
+ VariableSet vs = new VariableSet();
+
+ // add the input variables for the function to input variable list
+ FunctionStatement fstmt = (FunctionStatement)fblock.getStatement(0);
+ for (DataIdentifier currVar : fstmt.getInputParams()) {
+ if (currVar.getDataType() == DataType.SCALAR)
+ currVar.setDimensions(0, 0);
+ vs.addVariable(currVar.getName(), currVar);
+ }
+ fblock.validate(dmlp, vs, constVars, false);
}
- fblock.validate(dmlp, vs, constVars, false);
- }
-
- }
+ }
+ }
// handle regular blocks -- "main" program
VariableSet vs = new VariableSet();
@@ -159,55 +159,60 @@ public class DMLTranslator
StatementBlock sb = dmlp.getStatementBlock(i);
vs = sb.validate(dmlp, vs, constVars, fWriteRead);
constVars = sb.getConstOut();
- }
+ }
}
}
public void liveVariableAnalysis(DMLProgram dmlp) {
+ liveVariableAnalysis(dmlp, true);
+ }
+
+ public void liveVariableAnalysis(DMLProgram dmlp, boolean inclFuns) {
// for each namespace, handle function program blocks -- forward direction
- for (String namespaceKey : dmlp.getNamespaces().keySet()) {
- for (String fname: dmlp.getFunctionStatementBlocks(namespaceKey).keySet()) {
- FunctionStatementBlock fsb = dmlp.getFunctionStatementBlock(namespaceKey, fname);
- FunctionStatement fstmt = (FunctionStatement)fsb.getStatement(0);
-
- // perform function inlining
- fstmt.setBody(StatementBlock.mergeFunctionCalls(fstmt.getBody(), dmlp));
-
- VariableSet activeIn = new VariableSet();
- for (DataIdentifier id : fstmt.getInputParams()){
- activeIn.addVariable(id.getName(), id);
+ if( inclFuns ) {
+ for (String namespaceKey : dmlp.getNamespaces().keySet()) {
+ for (String fname: dmlp.getFunctionStatementBlocks(namespaceKey).keySet()) {
+ FunctionStatementBlock fsb = dmlp.getFunctionStatementBlock(namespaceKey, fname);
+ FunctionStatement fstmt = (FunctionStatement)fsb.getStatement(0);
+
+ // perform function inlining
+ fstmt.setBody(StatementBlock.mergeFunctionCalls(fstmt.getBody(), dmlp));
+
+ VariableSet activeIn = new VariableSet();
+ for (DataIdentifier id : fstmt.getInputParams()){
+ activeIn.addVariable(id.getName(), id);
+ }
+ fsb.initializeforwardLV(activeIn);
}
- fsb.initializeforwardLV(activeIn);
- }
- }
-
- // for each namespace, handle function program blocks -- backward direction
- for (String namespaceKey : dmlp.getNamespaces().keySet()) {
- for (String fname: dmlp.getFunctionStatementBlocks(namespaceKey).keySet()) {
-
- // add output variables to liveout / activeout set
- FunctionStatementBlock fsb = dmlp.getFunctionStatementBlock(namespaceKey, fname);
- VariableSet currentLiveOut = new VariableSet();
- VariableSet currentLiveIn = new VariableSet();
- FunctionStatement fstmt = (FunctionStatement)fsb.getStatement(0);
-
- for (DataIdentifier id : fstmt.getInputParams())
- currentLiveIn.addVariable(id.getName(), id);
-
- for (DataIdentifier id : fstmt.getOutputParams())
- currentLiveOut.addVariable(id.getName(), id);
-
- fsb._liveOut = currentLiveOut;
- fsb.analyze(currentLiveIn, currentLiveOut);
}
- }
+ // for each namespace, handle function program blocks -- backward direction
+ for (String namespaceKey : dmlp.getNamespaces().keySet()) {
+ for (String fname: dmlp.getFunctionStatementBlocks(namespaceKey).keySet()) {
+
+ // add output variables to liveout / activeout set
+ FunctionStatementBlock fsb = dmlp.getFunctionStatementBlock(namespaceKey, fname);
+ VariableSet currentLiveOut = new VariableSet();
+ VariableSet currentLiveIn = new VariableSet();
+ FunctionStatement fstmt = (FunctionStatement)fsb.getStatement(0);
+
+ for (DataIdentifier id : fstmt.getInputParams())
+ currentLiveIn.addVariable(id.getName(), id);
+
+ for (DataIdentifier id : fstmt.getOutputParams())
+ currentLiveOut.addVariable(id.getName(), id);
+
+ fsb._liveOut = currentLiveOut;
+ fsb.analyze(currentLiveIn, currentLiveOut);
+ }
+ }
+ }
// handle regular program blocks
VariableSet currentLiveOut = new VariableSet();
VariableSet activeIn = new VariableSet();
-
+
// handle function inlining
dmlp.setStatementBlocks(StatementBlock.mergeFunctionCalls(dmlp.getStatementBlocks(), dmlp));
@@ -226,18 +231,19 @@ public class DMLTranslator
}
}
- /**
- * Construct Hops from parse tree
- *
- * @param dmlp dml program
- */
public void constructHops(DMLProgram dmlp) {
+ constructHops(dmlp, true);
+ }
+
+ public void constructHops(DMLProgram dmlp, boolean inclFuns) {
// Step 1: construct hops for all functions
- // for each namespace, handle function program blocks
- for (String namespaceKey : dmlp.getNamespaces().keySet()){
- for (String fname: dmlp.getFunctionStatementBlocks(namespaceKey).keySet()) {
- FunctionStatementBlock current = dmlp.getFunctionStatementBlock(namespaceKey, fname);
- constructHops(current);
+ if( inclFuns ) {
+ // for each namespace, handle function program blocks
+ for (String namespaceKey : dmlp.getNamespaces().keySet()){
+ for (String fname: dmlp.getFunctionStatementBlocks(namespaceKey).keySet()) {
+ FunctionStatementBlock current = dmlp.getFunctionStatementBlock(namespaceKey, fname);
+ constructHops(current);
+ }
}
}