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/04/08 04:22:58 UTC
[2/2] incubator-systemml git commit: [SYSTEMML-1439] Improved codegen
row-aggregate candidate exploration
[SYSTEMML-1439] Improved codegen row-aggregate candidate exploration
This patch generalizes the existing candidate exploration algorithm to
enable merging of partial rowagg templates. Together with a couple of
minor fixes and cleanups, this allows us now fusing the following
expression (from Kmeans) into a single operator.
Y = (X <= rowMins(X));
Z = (Y / rowSums(Y));
R = colSums(Z);
Note that the first row aggregate and row comparison consume the
original rows whereas the subsequent row aggregate and element-wise
division work over temporary row vectors (with internal reuse of
thread-local temporary row vectors).
Project: http://git-wip-us.apache.org/repos/asf/incubator-systemml/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-systemml/commit/5de7beea
Tree: http://git-wip-us.apache.org/repos/asf/incubator-systemml/tree/5de7beea
Diff: http://git-wip-us.apache.org/repos/asf/incubator-systemml/diff/5de7beea
Branch: refs/heads/master
Commit: 5de7beea2f5d4b9d6c9a8f7f3ae152b7442cf923
Parents: 18ab98a
Author: Matthias Boehm <mb...@gmail.com>
Authored: Fri Apr 7 21:23:58 2017 -0700
Committer: Matthias Boehm <mb...@gmail.com>
Committed: Fri Apr 7 21:23:58 2017 -0700
----------------------------------------------------------------------
.../sysml/hops/codegen/SpoofCompiler.java | 3 +-
.../sysml/hops/codegen/cplan/CNodeUnary.java | 7 +++-
.../hops/codegen/template/TemplateUtils.java | 5 +++
.../sysml/hops/rewrite/HopRewriteUtils.java | 43 +++++---------------
.../functions/codegen/AlgorithmLinregCG.java | 2 +-
5 files changed, 24 insertions(+), 36 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/5de7beea/src/main/java/org/apache/sysml/hops/codegen/SpoofCompiler.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/codegen/SpoofCompiler.java b/src/main/java/org/apache/sysml/hops/codegen/SpoofCompiler.java
index 2e60732..3dfb452 100644
--- a/src/main/java/org/apache/sysml/hops/codegen/SpoofCompiler.java
+++ b/src/main/java/org/apache/sysml/hops/codegen/SpoofCompiler.java
@@ -439,7 +439,8 @@ public class SpoofCompiler
if( k != pos ) {
Hop input2 = hop.getInput().get(k);
if( memo.contains(input2.getHopID()) && !memo.get(input2.getHopID()).get(0).closed
- && memo.get(input2.getHopID()).get(0).type == TemplateType.CellTpl && tpl.merge(hop, input2) )
+ && TemplateUtils.isType(memo.get(input2.getHopID()).get(0).type, tpl.getType(), TemplateType.CellTpl)
+ && tpl.merge(hop, input2) )
P.crossProduct(k, -1L, input2.getHopID());
else
P.crossProduct(k, -1L);
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/5de7beea/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeUnary.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeUnary.java b/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeUnary.java
index 262295c..025033b 100644
--- a/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeUnary.java
+++ b/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeUnary.java
@@ -130,8 +130,9 @@ public class CNodeUnary extends CNode
sb.append(_inputs.get(0).codegen(sparse));
//generate unary operation
+ boolean lsparse = sparse && (_inputs.get(0) instanceof CNodeData);
String var = createVarname();
- String tmp = _type.getTemplate(sparse);
+ String tmp = _type.getTemplate(lsparse);
tmp = tmp.replaceAll("%TMP%", var);
String varj = _inputs.get(0).getVarname();
@@ -142,7 +143,9 @@ public class CNodeUnary extends CNode
tmp = tmp.replaceAll("%IN1%", varj );
//replace start position of main input
- String spos = !varj.startsWith("b") ? varj+"i" : "0";
+ String spos = (!varj.startsWith("b")
+ && _inputs.get(0) instanceof CNodeData
+ && _inputs.get(0).getDataType().isMatrix()) ? varj+"i" : "0";
tmp = tmp.replaceAll("%POS1%", spos);
tmp = tmp.replaceAll("%POS2%", spos);
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/5de7beea/src/main/java/org/apache/sysml/hops/codegen/template/TemplateUtils.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/codegen/template/TemplateUtils.java b/src/main/java/org/apache/sysml/hops/codegen/template/TemplateUtils.java
index c6a259f..e8d2086 100644
--- a/src/main/java/org/apache/sysml/hops/codegen/template/TemplateUtils.java
+++ b/src/main/java/org/apache/sysml/hops/codegen/template/TemplateUtils.java
@@ -25,6 +25,7 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
+import org.apache.commons.lang.ArrayUtils;
import org.apache.sysml.hops.AggBinaryOp;
import org.apache.sysml.hops.AggUnaryOp;
import org.apache.sysml.hops.BinaryOp;
@@ -294,4 +295,8 @@ public class TemplateUtils
return ret + ((node instanceof CNodeBinary
&& ((CNodeBinary)node).getType().isVectorScalarPrimitive()) ? 1 : 0);
}
+
+ public static boolean isType(TemplateType type, TemplateType... validTypes) {
+ return ArrayUtils.contains(validTypes, type);
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/5de7beea/src/main/java/org/apache/sysml/hops/rewrite/HopRewriteUtils.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/rewrite/HopRewriteUtils.java b/src/main/java/org/apache/sysml/hops/rewrite/HopRewriteUtils.java
index fcfc14b..a4b6ec1 100644
--- a/src/main/java/org/apache/sysml/hops/rewrite/HopRewriteUtils.java
+++ b/src/main/java/org/apache/sysml/hops/rewrite/HopRewriteUtils.java
@@ -22,6 +22,7 @@ package org.apache.sysml.hops.rewrite;
import java.util.ArrayList;
import java.util.HashMap;
+import org.apache.commons.lang.ArrayUtils;
import org.apache.sysml.api.DMLScript;
import org.apache.sysml.api.DMLScript.RUNTIME_PLATFORM;
import org.apache.sysml.conf.ConfigurationManager;
@@ -1066,46 +1067,24 @@ public class HopRewriteUtils
//////////////////////////////////////
// utils for lookup tables
- public static boolean isValidOp( AggOp input, AggOp[] validTab )
- {
- for( AggOp valid : validTab )
- if( valid == input )
- return true;
- return false;
+ public static boolean isValidOp( AggOp input, AggOp[] validTab ) {
+ return ArrayUtils.contains(validTab, input);
}
- public static boolean isValidOp( OpOp1 input, OpOp1[] validTab )
- {
- for( OpOp1 valid : validTab )
- if( valid == input )
- return true;
- return false;
+ public static boolean isValidOp( OpOp1 input, OpOp1[] validTab ) {
+ return ArrayUtils.contains(validTab, input);
}
- public static boolean isValidOp( OpOp2 input, OpOp2[] validTab )
- {
- for( OpOp2 valid : validTab )
- if( valid == input )
- return true;
- return false;
+ public static boolean isValidOp( OpOp2 input, OpOp2[] validTab ) {
+ return ArrayUtils.contains(validTab, input);
}
- public static boolean isValidOp( ReOrgOp input, ReOrgOp[] validTab )
- {
- for( ReOrgOp valid : validTab )
- if( valid == input )
- return true;
- return false;
+ public static boolean isValidOp( ReOrgOp input, ReOrgOp[] validTab ) {
+ return ArrayUtils.contains(validTab, input);
}
- public static int getValidOpPos( OpOp2 input, OpOp2[] validTab )
- {
- for( int i=0; i<validTab.length; i++ ) {
- OpOp2 valid = validTab[i];
- if( valid == input )
- return i;
- }
- return -1;
+ public static int getValidOpPos( OpOp2 input, OpOp2[] validTab ) {
+ return ArrayUtils.indexOf(validTab, input);
}
/**
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/5de7beea/src/test/java/org/apache/sysml/test/integration/functions/codegen/AlgorithmLinregCG.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/sysml/test/integration/functions/codegen/AlgorithmLinregCG.java b/src/test/java/org/apache/sysml/test/integration/functions/codegen/AlgorithmLinregCG.java
index 6e3549e..dacc6ee 100644
--- a/src/test/java/org/apache/sysml/test/integration/functions/codegen/AlgorithmLinregCG.java
+++ b/src/test/java/org/apache/sysml/test/integration/functions/codegen/AlgorithmLinregCG.java
@@ -41,7 +41,7 @@ public class AlgorithmLinregCG extends AutomatedTestBase
private final static String TEST_CONF = "SystemML-config-codegen.xml";
private final static File TEST_CONF_FILE = new File(SCRIPT_DIR + TEST_DIR, TEST_CONF);
- private final static double eps = 1e-5;
+ private final static double eps = 1e-1;
private final static int rows = 2468;
private final static int cols = 507;