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/01/25 19:28:03 UTC

[2/3] incubator-systemml git commit: [SYSTEMML-382] Performance sparse-sparse binary matrix-matrix operations

[SYSTEMML-382] Performance sparse-sparse binary matrix-matrix operations

This change exploits the new sparse block alignment checks for
sparse-sparse binary matrix-matrix operations. Despite the already
linear time operation, this change improved performance by >10%. The
larger the number of columns (nnz per row), the larger the observed
improvements. 

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

Branch: refs/heads/master
Commit: eb25f160df046800a474eea567e8121e15fab110
Parents: f3d95cb
Author: Matthias Boehm <mb...@us.ibm.com>
Authored: Sun Jan 24 21:00:25 2016 -0800
Committer: Matthias Boehm <mb...@us.ibm.com>
Committed: Sun Jan 24 21:00:25 2016 -0800

----------------------------------------------------------------------
 .../runtime/matrix/data/LibMatrixBincell.java   | 48 ++++++++++++++------
 1 file changed, 34 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/eb25f160/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 47a46d4..2dfa7ba 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
@@ -267,22 +267,42 @@ public class LibMatrixBincell
 					SparseBlock lsblock = m1.sparseBlock;
 					SparseBlock rsblock = m2.sparseBlock;
 					
-					for(int r=0; r<rlen; r++)
+					if( ret.sparse && lsblock.isAligned(rsblock) )
 					{
-						if( !lsblock.isEmpty(r) && !rsblock.isEmpty(r) ) {
-							mergeForSparseBinary(op, lsblock.values(r), lsblock.indexes(r), lsblock.pos(r), lsblock.size(r),
-									rsblock.values(r), rsblock.indexes(r), rsblock.pos(r), rsblock.size(r), r, ret);	
-						}
-						else if( !rsblock.isEmpty(r) ) {
-							appendRightForSparseBinary(op, rsblock.values(r), rsblock.indexes(r), 
-									rsblock.pos(r), rsblock.size(r), 0, r, ret);
-						}
-						else if( !lsblock.isEmpty(r) ){
-							appendLeftForSparseBinary(op, lsblock.values(r), lsblock.indexes(r), 
-									lsblock.pos(r), lsblock.size(r), 0, r, ret);
+						SparseBlock c = ret.sparseBlock;
+						for(int r=0; r<rlen; r++) 
+							if( !lsblock.isEmpty(r) ) {
+								int alen = lsblock.size(r);
+								int apos = lsblock.pos(r);
+								int[] aix = lsblock.indexes(r);
+								double[] avals = lsblock.values(r);
+								double[] bvals = rsblock.values(r);
+								c.allocate(r, alen);
+								for( int j=apos; j<apos+alen; j++ ) {
+									double tmp = op.fn.execute(avals[j], bvals[j]);
+									c.append(r, aix[j], tmp);
+								}
+								ret.nonZeros += c.size(r);
+							}
+					}
+					else //general case
+					{	
+						for(int r=0; r<rlen; r++)
+						{
+							if( !lsblock.isEmpty(r) && !rsblock.isEmpty(r) ) {
+								mergeForSparseBinary(op, lsblock.values(r), lsblock.indexes(r), lsblock.pos(r), lsblock.size(r),
+										rsblock.values(r), rsblock.indexes(r), rsblock.pos(r), rsblock.size(r), r, ret);	
+							}
+							else if( !rsblock.isEmpty(r) ) {
+								appendRightForSparseBinary(op, rsblock.values(r), rsblock.indexes(r), 
+										rsblock.pos(r), rsblock.size(r), 0, r, ret);
+							}
+							else if( !lsblock.isEmpty(r) ){
+								appendLeftForSparseBinary(op, lsblock.values(r), lsblock.indexes(r), 
+										lsblock.pos(r), lsblock.size(r), 0, r, ret);
+							}
+							// do nothing if both not existing
 						}
-						
-						// do nothing if both not existing
 					}
 				}
 				//right sparse block existing