[SYSTEMML-1472] Improved codegen handling of empty inputs w/o alloc Project: http://git-wip-us.apache.org/repos/asf/incubator-systemml/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-systemml/commit/f2ea6336 Tree: http://git-wip-us.apache.org/repos/asf/incubator-systemml/tree/f2ea6336 Diff: http://git-wip-us.apache.org/repos/asf/incubator-systemml/diff/f2ea6336
Branch: refs/heads/master Commit: f2ea6336fea757ba0fb81f315af9bb97df6615d3 Parents: 5744e75 Author: Matthias Boehm <[email protected]> Authored: Thu Apr 6 17:14:45 2017 -0700 Committer: Matthias Boehm <[email protected]> Committed: Thu Apr 6 21:16:30 2017 -0700 ---------------------------------------------------------------------- .../org/apache/sysml/hops/codegen/cplan/CNodeTernary.java | 2 +- .../org/apache/sysml/hops/codegen/cplan/CNodeUnary.java | 4 ++-- .../org/apache/sysml/runtime/codegen/SpoofOperator.java | 9 +++++++-- .../integration/functions/codegen/MultiAggTmplTest.java | 8 ++++---- 4 files changed, 14 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/f2ea6336/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeTernary.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeTernary.java b/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeTernary.java index a8bbcb2..b3b1942 100644 --- a/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeTernary.java +++ b/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeTernary.java @@ -54,7 +54,7 @@ public class CNodeTernary extends CNode return " double %TMP% = Double.isNaN(%IN1%) ? %IN3% : %IN1%;\n"; case LOOKUP_RC1: - return " double %TMP% = %IN1%[rowIndex*%IN2%+%IN3%-1];\n"; + return " double %TMP% = getValue(%IN1%, rowIndex*%IN2%+%IN3%-1);\n"; default: throw new RuntimeException("Invalid ternary type: "+this.toString()); http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/f2ea6336/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 e28a989..9d3a877 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 @@ -48,9 +48,9 @@ public class CNodeUnary extends CNode case EXP: return " double %TMP% = FastMath.exp(%IN1%);\n"; case LOOKUP_R: - return " double %TMP% = %IN1%[rowIndex];\n"; + return " double %TMP% = getValue(%IN1%, rowIndex);\n"; case LOOKUP_RC: - return " double %TMP% = %IN1%[rowIndex*n+colIndex];\n"; + return " double %TMP% = getValue(%IN1%, rowIndex*n+colIndex);\n"; case LOOKUP0: return " double %TMP% = %IN1%[0];\n" ; case POW2: http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/f2ea6336/src/main/java/org/apache/sysml/runtime/codegen/SpoofOperator.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/codegen/SpoofOperator.java b/src/main/java/org/apache/sysml/runtime/codegen/SpoofOperator.java index c62a535..ced10f9 100644 --- a/src/main/java/org/apache/sysml/runtime/codegen/SpoofOperator.java +++ b/src/main/java/org/apache/sysml/runtime/codegen/SpoofOperator.java @@ -70,8 +70,7 @@ public abstract class SpoofOperator implements Serializable for(int i=offset; i<offset+len; i++) { //convert empty or sparse to dense temporary block (note: we don't do //this in place because this block might be used by multiple threads) - if( (inputs.get(i).isEmptyBlock(false) && !inputs.get(i).isAllocated()) - || inputs.get(i).isInSparseFormat() ) { + if( inputs.get(i).isInSparseFormat() && inputs.get(i).isAllocated() ) { MatrixBlock tmp = inputs.get(i); b[i-offset] = DataConverter.convertToDoubleVector(tmp); LOG.warn(getClass().getName()+": Converted "+tmp.getNumRows()+"x"+tmp.getNumColumns()+ @@ -92,4 +91,10 @@ public abstract class SpoofOperator implements Serializable scalars[i] = scalarObjects.get(i).getDoubleValue(); return scalars; } + + //abstraction for safely accessing sideways matrices without the need + //to allocate empty matrices as dense, see prepInputMatrices + protected static double getValue(double[] data, int index) { + return (data!=null) ? data[index] : 0; + } } http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/f2ea6336/src/test/java/org/apache/sysml/test/integration/functions/codegen/MultiAggTmplTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/sysml/test/integration/functions/codegen/MultiAggTmplTest.java b/src/test/java/org/apache/sysml/test/integration/functions/codegen/MultiAggTmplTest.java index 21aabb8..b25d496 100644 --- a/src/test/java/org/apache/sysml/test/integration/functions/codegen/MultiAggTmplTest.java +++ b/src/test/java/org/apache/sysml/test/integration/functions/codegen/MultiAggTmplTest.java @@ -59,12 +59,12 @@ public class MultiAggTmplTest extends AutomatedTestBase } @Test - public void testCodegenRowAgg1CP() { + public void testCodegenMultiAgg1CP() { testCodegenIntegration( TEST_NAME1, false, ExecType.CP ); } @Test - public void testCodegenRowAgg1Spark() { + public void testCodegenMultiAgg1Spark() { testCodegenIntegration( TEST_NAME1, false, ExecType.SPARK ); } @@ -74,12 +74,12 @@ public class MultiAggTmplTest extends AutomatedTestBase } @Test - public void testCodegenRowAgg2CP() { + public void testCodegenMultiAgg2CP() { testCodegenIntegration( TEST_NAME2, false, ExecType.CP ); } @Test - public void testCodegenRowAgg2Spark() { + public void testCodegenMultiAgg2Spark() { testCodegenIntegration( TEST_NAME2, false, ExecType.SPARK ); }
