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