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/20 02:51:30 UTC

[1/4] incubator-systemml git commit: [MINOR] Graceful value type casting of scalar function args, cleanup

Repository: incubator-systemml
Updated Branches:
  refs/heads/master d69fdfe45 -> 117ea480d


[MINOR] Graceful value type casting of scalar function args, cleanup 

Project: http://git-wip-us.apache.org/repos/asf/incubator-systemml/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-systemml/commit/53fe1ae6
Tree: http://git-wip-us.apache.org/repos/asf/incubator-systemml/tree/53fe1ae6
Diff: http://git-wip-us.apache.org/repos/asf/incubator-systemml/diff/53fe1ae6

Branch: refs/heads/master
Commit: 53fe1ae68ab3b5024ead0d258a213f3e4f392616
Parents: d69fdfe
Author: Matthias Boehm <mb...@gmail.com>
Authored: Tue Apr 18 01:37:55 2017 -0700
Committer: Matthias Boehm <mb...@gmail.com>
Committed: Wed Apr 19 18:46:28 2017 -0700

----------------------------------------------------------------------
 .../sysml/debug/DMLDebuggerFunctions.java       | 31 ++---------------
 .../sysml/hops/ipa/InterProceduralAnalysis.java | 17 ++-------
 .../sysml/hops/rewrite/HopRewriteUtils.java     | 27 +++------------
 .../context/ExecutionContext.java               | 29 ++--------------
 .../cp/FunctionCallCPInstruction.java           | 11 +++++-
 .../instructions/cp/ScalarObjectFactory.java    | 36 ++++++++++++++++++--
 6 files changed, 58 insertions(+), 93 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/53fe1ae6/src/main/java/org/apache/sysml/debug/DMLDebuggerFunctions.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/debug/DMLDebuggerFunctions.java b/src/main/java/org/apache/sysml/debug/DMLDebuggerFunctions.java
index d852747..09bb0d6 100644
--- a/src/main/java/org/apache/sysml/debug/DMLDebuggerFunctions.java
+++ b/src/main/java/org/apache/sysml/debug/DMLDebuggerFunctions.java
@@ -34,14 +34,9 @@ import org.apache.sysml.runtime.controlprogram.LocalVariableMap;
 import org.apache.sysml.runtime.controlprogram.caching.MatrixObject;
 import org.apache.sysml.runtime.instructions.Instruction;
 import org.apache.sysml.runtime.instructions.MRJobInstruction;
-import org.apache.sysml.runtime.instructions.cp.BooleanObject;
 import org.apache.sysml.runtime.instructions.cp.BreakPointInstruction;
 import org.apache.sysml.runtime.instructions.cp.CPInstruction;
-import org.apache.sysml.runtime.instructions.cp.Data;
-import org.apache.sysml.runtime.instructions.cp.DoubleObject;
-import org.apache.sysml.runtime.instructions.cp.IntObject;
-import org.apache.sysml.runtime.instructions.cp.ScalarObject;
-import org.apache.sysml.runtime.instructions.cp.StringObject;
+import org.apache.sysml.runtime.instructions.cp.ScalarObjectFactory;
 import org.apache.sysml.runtime.instructions.cp.BreakPointInstruction.BPINSTRUCTION_STATUS;
 import org.apache.sysml.runtime.matrix.data.MatrixBlock;
 
@@ -269,28 +264,8 @@ public class DMLDebuggerFunctions {
 		if (variables != null && !variables.keySet().isEmpty()) {
 			if (variables.get(varname) != null) {
 				if (variables.get(varname).getDataType() == DataType.SCALAR) {
-					Data value;
-					switch(variables.get(varname).getValueType()) {
-						case DOUBLE:
-							double d = Double.parseDouble(args[1]);
-							value = (ScalarObject) new DoubleObject(d);
-							break;
-						case INT:
-							long i = Long.parseLong(args[1]);
-							value = (ScalarObject) new IntObject(i);
-							break;
-						case BOOLEAN:
-							boolean b = Boolean.parseBoolean(args[1]);
-							value = (ScalarObject) new BooleanObject(b);
-							break;
-						case STRING:
-							value = (ScalarObject) new StringObject(args[1]);
-							break;
-						default:
-							System.err.println("Invalid scalar value type.");
-							return;
-					}
-					variables.put(varname, value);
+					variables.put(varname, ScalarObjectFactory
+						.createScalarObject(variables.get(varname).getValueType(), args[1]));
 					System.out.println(varname + " = " + variables.get(varname).toString());
 				}
 				else

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/53fe1ae6/src/main/java/org/apache/sysml/hops/ipa/InterProceduralAnalysis.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/ipa/InterProceduralAnalysis.java b/src/main/java/org/apache/sysml/hops/ipa/InterProceduralAnalysis.java
index 4cea2e2..b0ebfaa 100644
--- a/src/main/java/org/apache/sysml/hops/ipa/InterProceduralAnalysis.java
+++ b/src/main/java/org/apache/sysml/hops/ipa/InterProceduralAnalysis.java
@@ -70,12 +70,9 @@ import org.apache.sysml.parser.WhileStatement;
 import org.apache.sysml.parser.WhileStatementBlock;
 import org.apache.sysml.runtime.controlprogram.LocalVariableMap;
 import org.apache.sysml.runtime.controlprogram.caching.MatrixObject;
-import org.apache.sysml.runtime.instructions.cp.BooleanObject;
 import org.apache.sysml.runtime.instructions.cp.Data;
-import org.apache.sysml.runtime.instructions.cp.DoubleObject;
-import org.apache.sysml.runtime.instructions.cp.IntObject;
 import org.apache.sysml.runtime.instructions.cp.ScalarObject;
-import org.apache.sysml.runtime.instructions.cp.StringObject;
+import org.apache.sysml.runtime.instructions.cp.ScalarObjectFactory;
 import org.apache.sysml.runtime.matrix.MatrixCharacteristics;
 import org.apache.sysml.runtime.matrix.MatrixFormatMetaData;
 import org.apache.sysml.udf.lib.DeNaNWrapper;
@@ -695,16 +692,8 @@ public class InterProceduralAnalysis
 				//always propagate scalar literals into functions
 				//(for multiple calls, literal equivalence already checked)
 				if( input instanceof LiteralOp ) {
-					LiteralOp lit = (LiteralOp)input;
-					ScalarObject scalar = null;
-					switch(input.getValueType()) {
-						case DOUBLE:	scalar = new DoubleObject(lit.getDoubleValue()); break;
-						case INT:		scalar = new IntObject(lit.getLongValue()); break;
-						case BOOLEAN: 	scalar = new BooleanObject(lit.getBooleanValue()); break;
-						case STRING:	scalar = new StringObject(lit.getStringValue()); break;
-						default: //do nothing
-					}
-					vars.put(dat.getName(), scalar);
+					vars.put(dat.getName(), ScalarObjectFactory
+						.createScalarObject(input.getValueType(), (LiteralOp)input));
 				}
 				//propagate scalar variables into functions if called once
 				//and input scalar is existing variable in symbol table

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/53fe1ae6/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 ba5d1ab..f3baec1 100644
--- a/src/main/java/org/apache/sysml/hops/rewrite/HopRewriteUtils.java
+++ b/src/main/java/org/apache/sysml/hops/rewrite/HopRewriteUtils.java
@@ -56,12 +56,8 @@ import org.apache.sysml.parser.DataIdentifier;
 import org.apache.sysml.parser.Statement;
 import org.apache.sysml.parser.Expression.DataType;
 import org.apache.sysml.parser.Expression.ValueType;
-import org.apache.sysml.runtime.DMLRuntimeException;
-import org.apache.sysml.runtime.instructions.cp.BooleanObject;
-import org.apache.sysml.runtime.instructions.cp.DoubleObject;
-import org.apache.sysml.runtime.instructions.cp.IntObject;
 import org.apache.sysml.runtime.instructions.cp.ScalarObject;
-import org.apache.sysml.runtime.instructions.cp.StringObject;
+import org.apache.sysml.runtime.instructions.cp.ScalarObjectFactory;
 import org.apache.sysml.runtime.matrix.data.MatrixBlock;
 import org.apache.sysml.runtime.util.UtilFunctions;
 
@@ -196,26 +192,13 @@ public class HopRewriteUtils
 	
 	public static ScalarObject getScalarObject( LiteralOp op )
 	{
-		ScalarObject ret = null;
-		
-		try
-		{
-			switch( op.getValueType() )
-			{
-				case DOUBLE:  ret = new DoubleObject(op.getDoubleValue()); break;
-				case INT:	  ret = new IntObject(op.getLongValue()); break;
-				case BOOLEAN: ret = new BooleanObject(op.getBooleanValue()); break;
-				case STRING:  ret = new StringObject(op.getStringValue()); break;
-				default:
-					throw new DMLRuntimeException("Invalid scalar object value type: "+op.getValueType());
-			}
+		try {
+			return ScalarObjectFactory
+				.createScalarObject(op.getValueType(), op);
 		}
-		catch(Exception ex)
-		{
+		catch(Exception ex) {
 			throw new RuntimeException("Failed to create scalar object for constant. Continue.", ex);
 		}
-		
-		return ret;
 	}
 	
 

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/53fe1ae6/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContext.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContext.java b/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContext.java
index 6455add..b6e1830 100644
--- a/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContext.java
+++ b/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContext.java
@@ -36,13 +36,10 @@ import org.apache.sysml.runtime.controlprogram.caching.FrameObject;
 import org.apache.sysml.runtime.controlprogram.caching.MatrixObject;
 import org.apache.sysml.runtime.controlprogram.caching.MatrixObject.UpdateType;
 import org.apache.sysml.runtime.instructions.Instruction;
-import org.apache.sysml.runtime.instructions.cp.BooleanObject;
 import org.apache.sysml.runtime.instructions.cp.Data;
-import org.apache.sysml.runtime.instructions.cp.DoubleObject;
 import org.apache.sysml.runtime.instructions.cp.FunctionCallCPInstruction;
-import org.apache.sysml.runtime.instructions.cp.IntObject;
 import org.apache.sysml.runtime.instructions.cp.ScalarObject;
-import org.apache.sysml.runtime.instructions.cp.StringObject;
+import org.apache.sysml.runtime.instructions.cp.ScalarObjectFactory;
 import org.apache.sysml.runtime.instructions.gpu.context.GPUContext;
 import org.apache.sysml.runtime.instructions.gpu.context.GPUObject;
 import org.apache.sysml.runtime.matrix.MatrixCharacteristics;
@@ -53,7 +50,6 @@ import org.apache.sysml.runtime.matrix.data.FrameBlock;
 import org.apache.sysml.runtime.matrix.data.MatrixBlock;
 import org.apache.sysml.runtime.matrix.data.Pair;
 import org.apache.sysml.runtime.util.MapReduceTool;
-import org.apache.sysml.runtime.util.UtilFunctions;
 
 
 public class ExecutionContext 
@@ -347,31 +343,12 @@ public class ExecutionContext
 		throws DMLRuntimeException 
 	{
 		if ( isLiteral ) {
-			switch (vt) {
-			case INT:
-				long intVal = UtilFunctions.parseToLong(name);				
-				IntObject intObj = new IntObject(intVal);
-				return intObj;
-			case DOUBLE:
-				double doubleVal = Double.parseDouble(name);
-				DoubleObject doubleObj = new DoubleObject(doubleVal);
-				return doubleObj;
-			case BOOLEAN:
-				Boolean boolVal = Boolean.parseBoolean(name);
-				BooleanObject boolObj = new BooleanObject(boolVal);
-				return boolObj;
-			case STRING:
-				StringObject stringObj = new StringObject(name);
-				return stringObj;
-			default:
-				throw new DMLRuntimeException("Unknown value type: " + vt + " for variable: " + name);
-			}
+			return ScalarObjectFactory.createScalarObject(vt, name);
 		}
 		else {
 			Data obj = getVariable(name);
-			if (obj == null) {
+			if (obj == null)
 				throw new DMLRuntimeException("Unknown variable: " + name);
-			}
 			return (ScalarObject) obj;
 		}
 	}

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/53fe1ae6/src/main/java/org/apache/sysml/runtime/instructions/cp/FunctionCallCPInstruction.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/FunctionCallCPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/FunctionCallCPInstruction.java
index 67afdc8..c65553b 100644
--- a/src/main/java/org/apache/sysml/runtime/instructions/cp/FunctionCallCPInstruction.java
+++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/FunctionCallCPInstruction.java
@@ -151,9 +151,18 @@ public class FunctionCallCPInstruction extends CPInstruction
 				//get input matrix/frame/scalar
 				currFormalParamValue = (operand.getDataType()!=DataType.SCALAR) ? ec.getVariable(varname) : 
 					ec.getScalarInput(varname, operand.getValueType(), operand.isLiteral());
+				
+				//graceful value type conversion for scalar inputs with wrong type
+				if( currFormalParamValue.getDataType() == DataType.SCALAR
+					&& currFormalParamValue.getValueType() != operand.getValueType() )
+				{
+					ScalarObject so = (ScalarObject) currFormalParamValue;
+					currFormalParamValue = ScalarObjectFactory
+						.createScalarObject(operand.getValueType(), so);
+				}
 			}
 			
-			functionVariables.put(currFormalParamName,currFormalParamValue);						
+			functionVariables.put(currFormalParamName, currFormalParamValue);						
 		}
 		
 		// Pin the input variables so that they do not get deleted 

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/53fe1ae6/src/main/java/org/apache/sysml/runtime/instructions/cp/ScalarObjectFactory.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/ScalarObjectFactory.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/ScalarObjectFactory.java
index dfb0726..ea2c169 100644
--- a/src/main/java/org/apache/sysml/runtime/instructions/cp/ScalarObjectFactory.java
+++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/ScalarObjectFactory.java
@@ -19,18 +19,50 @@
 
 package org.apache.sysml.runtime.instructions.cp;
 
+import org.apache.sysml.hops.HopsException;
+import org.apache.sysml.hops.LiteralOp;
 import org.apache.sysml.parser.Expression.ValueType;
+import org.apache.sysml.runtime.util.UtilFunctions;
 
 public abstract class ScalarObjectFactory
 {
-
+	public static ScalarObject createScalarObject(ValueType vt, String value) {
+		switch( vt ) {
+			case INT:     return new IntObject(UtilFunctions.parseToLong(value));
+			case DOUBLE:  return new DoubleObject(Double.parseDouble(value));
+			case BOOLEAN: return new BooleanObject(Boolean.parseBoolean(value));
+			case STRING:  return new StringObject(value);
+			default: throw new RuntimeException("Unsupported scalar value type: "+vt.name());
+		}
+	}
+	
 	public static ScalarObject createScalarObject(ValueType vt, Object obj) {
 		switch( vt ) {
 			case BOOLEAN: return new BooleanObject((Boolean)obj);
 			case INT:     return new IntObject((Long)obj);
 			case DOUBLE:  return new DoubleObject((Double)obj);
 			case STRING:  return new StringObject((String)obj);
-			default: throw new RuntimeException("Unsupported scalar object type: "+vt.toString());
+			default: throw new RuntimeException("Unsupported scalar value type: "+vt.name());
+		}
+	}
+	
+	public static ScalarObject createScalarObject(ValueType vt, ScalarObject so) {
+		switch( vt ) {
+			case DOUBLE:  return new DoubleObject(so.getDoubleValue());
+			case INT:     return new IntObject(so.getLongValue());
+			case BOOLEAN: return new BooleanObject(so.getBooleanValue());
+			case STRING:  return new StringObject(so.getStringValue());
+			default: throw new RuntimeException("Unsupported scalar value type: "+vt.name());
+		}
+	}
+	
+	public static ScalarObject createScalarObject(ValueType vt, LiteralOp lit) throws HopsException {
+		switch( vt ) {
+			case DOUBLE:  return new DoubleObject(lit.getDoubleValue());
+			case INT:     return new IntObject(lit.getLongValue());
+			case BOOLEAN: return new BooleanObject(lit.getBooleanValue());
+			case STRING:  return new StringObject(lit.getStringValue());
+			default: throw new RuntimeException("Unsupported scalar value type: "+vt.name());
 		}
 	}
 }


[4/4] incubator-systemml git commit: [SYSTEMML-1547] Cache-conscious tsmm post-processing (copy upper, nnz)

Posted by mb...@apache.org.
[SYSTEMML-1547] Cache-conscious tsmm post-processing (copy upper, nnz)

This patch improves the performance of tsmm postprocessing including (1)
the copy of the upper triangular matrix to the lower triangle, and (2)
the number of non-zeros computation of the output. We now use a
cache-conscious scheme of copying similar to dense-dense transpose
including the fused maintenance of nnz. 

On a scenario of 10 iterations running outer products of 15K vectors
(with 15K x 15K outputs), this patch improved end-to-end execution time
from 16.2s to 11.4s 

Project: http://git-wip-us.apache.org/repos/asf/incubator-systemml/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-systemml/commit/117ea480
Tree: http://git-wip-us.apache.org/repos/asf/incubator-systemml/tree/117ea480
Diff: http://git-wip-us.apache.org/repos/asf/incubator-systemml/diff/117ea480

Branch: refs/heads/master
Commit: 117ea480dadbdaf8be4318eddbdf23018ce50544
Parents: b641edc
Author: Matthias Boehm <mb...@gmail.com>
Authored: Wed Apr 19 18:39:26 2017 -0700
Committer: Matthias Boehm <mb...@gmail.com>
Committed: Wed Apr 19 18:46:31 2017 -0700

----------------------------------------------------------------------
 .../runtime/matrix/data/LibMatrixMult.java      | 60 ++++++++++++++------
 .../runtime/matrix/data/LibMatrixReorg.java     |  2 +-
 2 files changed, 45 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/117ea480/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixMult.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixMult.java b/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixMult.java
index d746aa3..5c7c2ef 100644
--- a/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixMult.java
+++ b/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixMult.java
@@ -385,8 +385,8 @@ public class LibMatrixMult
 			matrixMultTransposeSelfDense(m1, ret, leftTranspose, 0, ret.rlen );
 
 		//post-processing
-		copyUpperToLowerTriangle( ret );		
-		ret.recomputeNonZeros();
+		long nnz = copyUpperToLowerTriangle(ret);
+		ret.setNonZeros(nnz);
 		ret.examSparsity();	
 		
 		//System.out.println("TSMM ("+m1.isInSparseFormat()+","+m1.getNumRows()+","+m1.getNumColumns()+","+m1.getNonZeros()+","+leftTranspose+") in "+time.stop());
@@ -436,8 +436,8 @@ public class LibMatrixMult
 		}
 		
 		//post-processing
-		copyUpperToLowerTriangle( ret );		
-		ret.recomputeNonZeros();
+		long nnz = copyUpperToLowerTriangle(ret);		
+		ret.setNonZeros(nnz);
 		ret.examSparsity();	
 		
 		//System.out.println("TSMM k="+k+" ("+m1.isInSparseFormat()+","+m1.getNumRows()+","+m1.getNumColumns()+","+m1.getNonZeros()+","+leftTranspose+") in "+time.stop());
@@ -3413,17 +3413,47 @@ public class LibMatrixMult
 	 * result down to lower triangular matrix once.
 	 * 
 	 * @param ret matrix
+	 * @return number of non zeros
 	 */
-	public static void copyUpperToLowerTriangle( MatrixBlock ret )
-	{
-		double[] c = ret.denseBlock;
-		final int m = ret.rlen;
-		final int n = ret.clen;
+	public static long copyUpperToLowerTriangle( MatrixBlock ret )
+	{
+		//ret is guaranteed to be a squared, symmetric matrix
+		if( ret.rlen != ret.clen )
+			throw new RuntimeException("Invalid non-squared input matrix.");
+		
+		final double[] c = ret.denseBlock;
+		final int n = ret.rlen;
+		long nnz = 0;
+		
+		//blocked execution (2x128KB for L2 blocking)
+		final int blocksizeIJ = 128; 
+		
+		//handle blocks on diagonal
+		for( int bi = 0; bi<n; bi+=blocksizeIJ ) {
+			int bimin = Math.min(bi+blocksizeIJ, n);
+			for( int i=bi, rix=bi*n; i<bimin; i++, rix+=n ) {
+				LibMatrixReorg.transposeRow(c, c, rix+bi, bi*n+i, n, bimin-bi);
+				for( int j=rix+i+1; j<rix+bimin; j++ )
+					nnz += (c[j] != 0) ? 2 : 0;
+				nnz++; //for diagonal element
+			}
+		}
 		
-		//copy symmetric values
-		for( int i=0, uix=0; i<m; i++, uix+=n )
-			for( int j=i+1, lix=j*n+i; j<n; j++, lix+=n )
-				c[ lix ] = c[ uix+j ];
+		//handle non-diagonal blocks (full block copies)
+		for( int bi = 0; bi<n; bi+=blocksizeIJ ) {
+			int bimin = Math.min(bi+blocksizeIJ, n);
+			for( int bj = bi; bj<n; bj+=blocksizeIJ ) 
+				if( bi != bj ) { //not on diagonal
+					int bjmin = Math.min(bj+blocksizeIJ, n);
+					for( int i=bi, rix=bi*n; i<bimin; i++, rix+=n ) {
+						LibMatrixReorg.transposeRow(c, c, rix+bj, bj*n+i, n, bjmin-bj);
+						for( int j=rix+bj; j<rix+bjmin; j++ )
+							nnz += (c[j] != 0) ? 2 : 0;
+					}
+				}
+		}
+		
+		return nnz;
 	}
 
 	private static MatrixBlock prepMatrixMultTransposeSelfInput( MatrixBlock m1, boolean leftTranspose ) 
@@ -3676,13 +3706,11 @@ public class LibMatrixMult
 		}
 		
 		@Override
-		public Object call() throws DMLRuntimeException
-		{
+		public Object call() throws DMLRuntimeException {
 			if( _m1.sparse )
 				matrixMultTransposeSelfSparse(_m1, _ret, _left, _rl, _ru);
 			else
 				matrixMultTransposeSelfDense(_m1, _ret, _left, _rl, _ru);
-			
 			return null;
 		}
 	}

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/117ea480/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixReorg.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixReorg.java b/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixReorg.java
index dfd19aa..9f45590 100644
--- a/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixReorg.java
+++ b/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixReorg.java
@@ -939,7 +939,7 @@ public class LibMatrixReorg
 		}
 	}
 
-	private static void transposeRow( double[] a, double[] c, int aix, int cix, int n2, int len )
+	static void transposeRow( double[] a, double[] c, int aix, int cix, int n2, int len )
 	{
 		final int bn = len%8;
 		


[2/4] incubator-systemml git commit: [SYSTEMML-1537] Fix codegen cost model (missing common operations)

Posted by mb...@apache.org.
[SYSTEMML-1537] Fix codegen cost model (missing common operations)

This patch includes ctable, centralmoment, and covariance in both binary
and ternary forms into the codegen cost model, which is used in the
cost-based plan selector.


Project: http://git-wip-us.apache.org/repos/asf/incubator-systemml/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-systemml/commit/7b7b9ba9
Tree: http://git-wip-us.apache.org/repos/asf/incubator-systemml/tree/7b7b9ba9
Diff: http://git-wip-us.apache.org/repos/asf/incubator-systemml/diff/7b7b9ba9

Branch: refs/heads/master
Commit: 7b7b9ba9ba48faab05f396ddbac0c81eb2cc50f3
Parents: 53fe1ae
Author: Matthias Boehm <mb...@gmail.com>
Authored: Tue Apr 18 14:23:50 2017 -0700
Committer: Matthias Boehm <mb...@gmail.com>
Committed: Wed Apr 19 18:46:29 2017 -0700

----------------------------------------------------------------------
 .../template/PlanSelectionFuseCostBased.java    | 34 ++++++++++++++++++--
 1 file changed, 31 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/7b7b9ba9/src/main/java/org/apache/sysml/hops/codegen/template/PlanSelectionFuseCostBased.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/codegen/template/PlanSelectionFuseCostBased.java b/src/main/java/org/apache/sysml/hops/codegen/template/PlanSelectionFuseCostBased.java
index ae2b076..70a6086 100644
--- a/src/main/java/org/apache/sysml/hops/codegen/template/PlanSelectionFuseCostBased.java
+++ b/src/main/java/org/apache/sysml/hops/codegen/template/PlanSelectionFuseCostBased.java
@@ -41,6 +41,7 @@ import org.apache.sysml.hops.Hop;
 import org.apache.sysml.hops.Hop.AggOp;
 import org.apache.sysml.hops.Hop.Direction;
 import org.apache.sysml.hops.IndexingOp;
+import org.apache.sysml.hops.LiteralOp;
 import org.apache.sysml.hops.ParameterizedBuiltinOp;
 import org.apache.sysml.hops.ReorgOp;
 import org.apache.sysml.hops.TernaryOp;
@@ -781,13 +782,26 @@ public class PlanSelectionFuseCostBased extends PlanSelection
 				case RBIND:   costs = 1; break;
 				case INTDIV:  costs = 6; break;
 				case MODULUS: costs = 8; break;
-				case DIV:    costs = 22; break;
+				case DIV:     costs = 22; break;
 				case LOG:
-				case LOG_NZ: costs = 32; break;
-				case POW:    costs = (HopRewriteUtils.isLiteralOfValue(
+				case LOG_NZ:  costs = 32; break;
+				case POW:     costs = (HopRewriteUtils.isLiteralOfValue(
 						current.getInput().get(1), 2) ? 1 : 16); break;
 				case MINUS_NZ:
 				case MINUS1_MULT: costs = 2; break;
+				case CENTRALMOMENT:
+					int type = (int) (current.getInput().get(1) instanceof LiteralOp ? 
+						HopRewriteUtils.getIntValueSafe((LiteralOp)current.getInput().get(1)) : 2);
+					switch( type ) {
+						case 0: costs = 1; break; //count
+						case 1: costs = 8; break; //mean
+						case 2: costs = 16; break; //cm2
+						case 3: costs = 31; break; //cm3
+						case 4: costs = 51; break; //cm4
+						case 5: costs = 16; break; //variance
+					}
+					break;
+				case COVARIANCE: costs = 23; break;
 				default:
 					throw new RuntimeException("Cost model not "
 						+ "implemented yet for: "+((BinaryOp)current).getOp());
@@ -797,6 +811,20 @@ public class PlanSelectionFuseCostBased extends PlanSelection
 			switch( ((TernaryOp)current).getOp() ) {
 				case PLUS_MULT: 
 				case MINUS_MULT: costs = 2; break;
+				case CTABLE:     costs = 3; break;
+				case CENTRALMOMENT:
+					int type = (int) (current.getInput().get(1) instanceof LiteralOp ? 
+						HopRewriteUtils.getIntValueSafe((LiteralOp)current.getInput().get(1)) : 2);
+					switch( type ) {
+						case 0: costs = 2; break; //count
+						case 1: costs = 9; break; //mean
+						case 2: costs = 17; break; //cm2
+						case 3: costs = 32; break; //cm3
+						case 4: costs = 52; break; //cm4
+						case 5: costs = 17; break; //variance
+					}
+					break;
+				case COVARIANCE: costs = 23; break;
 				default:
 					throw new RuntimeException("Cost model not "
 						+ "implemented yet for: "+((TernaryOp)current).getOp());


[3/4] incubator-systemml git commit: [SYSTEMML-1321] Improved dynamic recompilation (stats update p rewrites)

Posted by mb...@apache.org.
[SYSTEMML-1321] Improved dynamic recompilation (stats update p rewrites)

Project: http://git-wip-us.apache.org/repos/asf/incubator-systemml/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-systemml/commit/b641edc1
Tree: http://git-wip-us.apache.org/repos/asf/incubator-systemml/tree/b641edc1
Diff: http://git-wip-us.apache.org/repos/asf/incubator-systemml/diff/b641edc1

Branch: refs/heads/master
Commit: b641edc165aab129559a5db1bf5e9d050cd30b37
Parents: 7b7b9ba
Author: Matthias Boehm <mb...@gmail.com>
Authored: Tue Apr 18 14:27:39 2017 -0700
Committer: Matthias Boehm <mb...@gmail.com>
Committed: Wed Apr 19 18:46:30 2017 -0700

----------------------------------------------------------------------
 .../org/apache/sysml/hops/recompile/Recompiler.java  | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/b641edc1/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 6b74bf7..6c99d16 100644
--- a/src/main/java/org/apache/sysml/hops/recompile/Recompiler.java
+++ b/src/main/java/org/apache/sysml/hops/recompile/Recompiler.java
@@ -198,8 +198,14 @@ public class Recompiler
 				rUpdateStatistics( hopRoot, vars );
 			
 			// dynamic hop rewrites
-			if( !inplace )
+			if( !inplace ) {
 				_rewriter.get().rewriteHopDAGs( hops, null );
+				
+				//update stats after rewrites
+				Hop.resetVisitStatus(hops);
+				for( Hop hopRoot : hops )
+					rUpdateStatistics( hopRoot, vars );
+			}
 			
 			// refresh memory estimates (based on updated stats,
 			// before: init memo table with propagated worst-case estimates,
@@ -303,8 +309,13 @@ public class Recompiler
 			rUpdateStatistics( hops, vars );
 			
 			// dynamic hop rewrites
-			if( !inplace )
+			if( !inplace ) {
 				_rewriter.get().rewriteHopDAG( hops, null );
+				
+				//update stats after rewrites
+				hops.resetVisitStatus();
+				rUpdateStatistics( hops, vars );
+			}
 			
 			// refresh memory estimates (based on updated stats)
 			MemoTable memo = new MemoTable();