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/10/12 08:12:44 UTC
[2/5] systemml git commit: [SYSTEMML-1956] Performance sparse N:1
matrix-matrix reshape
[SYSTEMML-1956] Performance sparse N:1 matrix-matrix reshape
This patch improves performance for the special case of reshaping a
sparse m x n matrix into m2 x n2 where n%n2==0. In this case, we can
easily determine the number of non-zeros per target row from the input
row block, which allows to allocate the output once without unnecessary
repeated allocations.
On a 58825360 x 300 sparse input, this patch improved performance from
79s to 30.6s.
Project: http://git-wip-us.apache.org/repos/asf/systemml/repo
Commit: http://git-wip-us.apache.org/repos/asf/systemml/commit/92bad9ee
Tree: http://git-wip-us.apache.org/repos/asf/systemml/tree/92bad9ee
Diff: http://git-wip-us.apache.org/repos/asf/systemml/diff/92bad9ee
Branch: refs/heads/master
Commit: 92bad9ee3fc5389124faad0eb61eda748871e102
Parents: 0b5480b
Author: Matthias Boehm <mb...@gmail.com>
Authored: Wed Oct 11 15:39:41 2017 -0700
Committer: Matthias Boehm <mb...@gmail.com>
Committed: Thu Oct 12 01:13:06 2017 -0700
----------------------------------------------------------------------
.../runtime/matrix/data/LibMatrixReorg.java | 24 ++++++++++++++++++--
1 file changed, 22 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/systemml/blob/92bad9ee/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 c64bbc6..0bd4402 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
@@ -1161,7 +1161,7 @@ public class LibMatrixReorg
// * vector-matrix not really different from general
// * clen=1 and cols=1 will never be sparse.
- if( rows==1 ) //MATRIX->VECTOR
+ if( rows==1 ) //MATRIX->VECTOR
{
//note: cache-friendly on a and c; append-only
c.allocate(0, estnnz, cols);
@@ -1177,6 +1177,26 @@ public class LibMatrixReorg
}
}
}
+ else if( cols%clen==0 ) { //SPECIAL N:1 MATRIX->MATRIX
+ int n = cols/clen;
+ for(int bi=0, ci=0; bi<rlen; bi+=n, ci++) {
+ //allocate output row once (w/o re-allocations)
+ long lnnz = a.size(bi, bi+n);
+ c.allocate(ci, (int)lnnz);
+ //copy N input rows into output row
+ for( int i=bi, cix=0; i<bi+n; i++, cix+=clen ) {
+ if(a.isEmpty(i)) continue;
+ int apos = a.pos(i);
+ int alen = a.size(i);
+ int[] aix = a.indexes(i);
+ double[] avals = a.values(i);
+ for( int j=apos; j<apos+alen; j++ ) {
+ int cj = (int)((cix+aix[j])%cols);
+ c.append(ci, cj, avals[j]);
+ }
+ }
+ }
+ }
else //GENERAL CASE: MATRIX->MATRIX
{
//note: cache-friendly on a but not c; append-only
@@ -1193,7 +1213,7 @@ public class LibMatrixReorg
for( int j=apos; j<apos+alen; j++ )
{
int ci = (int)((cix+aix[j])/cols);
- int cj = (int)((cix+aix[j])%cols);
+ int cj = (int)((cix+aix[j])%cols);
c.allocate(ci, estnnz, cols);
c.append(ci, cj, avals[j]);
}