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 2016/07/21 19:54:43 UTC

[3/3] incubator-systemml git commit: [SYSTEMML-766] Performance axpy runtime (sparse-safe, dense-dense ops)

[SYSTEMML-766] Performance axpy runtime (sparse-safe, dense-dense ops)

The patch makes various performance improvements to axpy, i.e., +* and
-*, some of which also apply to other operations. On a scenario with
100kx1k dense matrices and 20 iterations, this led to an improvement
from 24s to 8.1s.    

(1) PlusMultiply and MinusMultiply marked as sparse-safe binary
operations (reduce runtime from 24s to 10.3s)
(2) Improved dense-dense binary operations: nnz and input handling
(reduced runtime from 10.3s to 8.1s).


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

Branch: refs/heads/master
Commit: 8a05574c8f2c5f63ef39db1ff76ed5d1cb6557b2
Parents: 973b863
Author: Matthias Boehm <mb...@us.ibm.com>
Authored: Wed Jul 20 23:56:33 2016 -0700
Committer: Matthias Boehm <mb...@us.ibm.com>
Committed: Thu Jul 21 12:54:19 2016 -0700

----------------------------------------------------------------------
 .../runtime/matrix/data/LibMatrixBincell.java   | 22 +++++++++++---------
 .../matrix/operators/BinaryOperator.java        | 16 +++++++-------
 2 files changed, 20 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/8a05574c/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixBincell.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixBincell.java b/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixBincell.java
index 5a0ccdb..dd0b9e0 100644
--- a/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixBincell.java
+++ b/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixBincell.java
@@ -35,6 +35,7 @@ import org.apache.sysml.runtime.functionobjects.NotEquals;
 import org.apache.sysml.runtime.functionobjects.Or;
 import org.apache.sysml.runtime.functionobjects.Plus;
 import org.apache.sysml.runtime.functionobjects.Power2;
+import org.apache.sysml.runtime.functionobjects.ValueFunction;
 import org.apache.sysml.runtime.matrix.operators.BinaryOperator;
 import org.apache.sysml.runtime.matrix.operators.ScalarOperator;
 import org.apache.sysml.runtime.util.DataConverter;
@@ -402,23 +403,24 @@ public class LibMatrixBincell
 				//3) recompute nnz
 				ret.recomputeNonZeros();
 			}
-			else if( !ret.sparse && !m1.sparse && !m2.sparse && m1.denseBlock!=null && m2.denseBlock!=null )
+			else if( !ret.sparse && !m1.sparse && !m2.sparse 
+					&& m1.denseBlock!=null && m2.denseBlock!=null )
 			{
 				ret.allocateDenseBlock();
 				final int m = ret.rlen;
 				final int n = ret.clen;
+				double[] a = m1.denseBlock;
+				double[] b = m2.denseBlock;
 				double[] c = ret.denseBlock;
+				ValueFunction fn = op.fn;
 				
-				//int nnz = 0;
-				for( int i=0; i<m*n; i++ )
-				{
-					c[i] = op.fn.execute(m1.denseBlock[i], m2.denseBlock[i]);
-					//HotSpot JVM bug causes crash in presence of NaNs 
-					//nnz += (c[i]!=0)? 1 : 0;
-					if( c[i] != 0 )
-						ret.nonZeros++;
+				//compute dense-dense binary, maintain nnz on-the-fly
+				int nnz = 0;
+				for( int i=0; i<m*n; i++ ) {
+					c[i] = fn.execute(a[i], b[i]);
+					nnz += (c[i]!=0)? 1 : 0;
 				}
-				//result.nonZeros = nnz;
+				ret.nonZeros = nnz;
 			}
 			else //generic case
 			{

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/8a05574c/src/main/java/org/apache/sysml/runtime/matrix/operators/BinaryOperator.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/matrix/operators/BinaryOperator.java b/src/main/java/org/apache/sysml/runtime/matrix/operators/BinaryOperator.java
index a268f49..69b3e5f 100644
--- a/src/main/java/org/apache/sysml/runtime/matrix/operators/BinaryOperator.java
+++ b/src/main/java/org/apache/sysml/runtime/matrix/operators/BinaryOperator.java
@@ -33,32 +33,32 @@ import org.apache.sysml.runtime.functionobjects.IntegerDivide;
 import org.apache.sysml.runtime.functionobjects.LessThan;
 import org.apache.sysml.runtime.functionobjects.LessThanEquals;
 import org.apache.sysml.runtime.functionobjects.Minus;
+import org.apache.sysml.runtime.functionobjects.MinusMultiply;
 import org.apache.sysml.runtime.functionobjects.MinusNz;
 import org.apache.sysml.runtime.functionobjects.Modulus;
 import org.apache.sysml.runtime.functionobjects.Multiply;
 import org.apache.sysml.runtime.functionobjects.NotEquals;
 import org.apache.sysml.runtime.functionobjects.Or;
 import org.apache.sysml.runtime.functionobjects.Plus;
+import org.apache.sysml.runtime.functionobjects.PlusMultiply;
 import org.apache.sysml.runtime.functionobjects.Power;
 import org.apache.sysml.runtime.functionobjects.ValueFunction;
 import org.apache.sysml.runtime.functionobjects.Builtin.BuiltinFunctionCode;
 
 public class BinaryOperator  extends Operator implements Serializable
 {
-
 	private static final long serialVersionUID = -2547950181558989209L;
 
 	public ValueFunction fn;
 	
 	public BinaryOperator(ValueFunction p)
 	{
-		fn=p;
-		//as long as (0 op 0)=0, then op is sparseSafe
-		if(fn instanceof Plus || fn instanceof Multiply || fn instanceof Minus 
-				|| fn instanceof And || fn instanceof Or)
-			sparseSafe=true;
-		else
-			sparseSafe=false;
+		fn = p;
+		
+		//binaryop is sparse-safe iff (0 op 0) == 0
+		sparseSafe = (fn instanceof Plus || fn instanceof Multiply 
+			|| fn instanceof Minus || fn instanceof And || fn instanceof Or 
+			|| fn instanceof PlusMultiply || fn instanceof MinusMultiply);
 	}
 	
 	/**