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/02/01 10:56:38 UTC
incubator-systemml git commit: [SYSTEMML-1140] Performance binary
sparse-dense mult/div (pre-allocate)
Repository: incubator-systemml
Updated Branches:
refs/heads/master 6009e88d6 -> 4f8648593
[SYSTEMML-1140] Performance binary sparse-dense mult/div (pre-allocate)
This patch improves the performance of sparse-dense element-wise
multiply and divide by pre-allocating the sparse output rows once with
the size of the sparse input rows, which likely comes close to the
output size given the dense right-hand-side.
Note that this patch does not fix all issues of [SYSTEMML-1140] but is a
related backlog item that we've encountered during the SPOOF
experiments.
The performance improvements are moderate at around 25% but tend to
increase with skew of sparse row sizes. On mnist60k, div sparse-dense,
the improvement was from 391ms to 296ms.
Project: http://git-wip-us.apache.org/repos/asf/incubator-systemml/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-systemml/commit/4f864859
Tree: http://git-wip-us.apache.org/repos/asf/incubator-systemml/tree/4f864859
Diff: http://git-wip-us.apache.org/repos/asf/incubator-systemml/diff/4f864859
Branch: refs/heads/master
Commit: 4f86485939d4777d2799a697b2cbc23ea93ee7e4
Parents: 6009e88
Author: Matthias Boehm <mb...@gmail.com>
Authored: Wed Feb 1 00:25:15 2017 +0100
Committer: Matthias Boehm <mb...@gmail.com>
Committed: Wed Feb 1 00:25:15 2017 +0100
----------------------------------------------------------------------
.../runtime/matrix/data/LibMatrixBincell.java | 34 ++++++++++++--------
1 file changed, 20 insertions(+), 14 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/4f864859/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 139d6fd..15d6e70 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
@@ -401,20 +401,26 @@ public class LibMatrixBincell
else if( skipEmpty && (m1.sparse || m2.sparse) )
{
SparseBlock a = m1.sparse ? m1.sparseBlock : m2.sparseBlock;
- if( a != null ) {
- MatrixBlock b = m1.sparse ? m2 : m1;
- for( int i=0; i<a.numRows(); i++ ) {
- 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 k = apos; k < apos+alen; k++) {
- double in2 = b.quickGetValue(i, aix[k]);
- if( in2==0 ) continue;
- double val = op.fn.execute(avals[k], in2);
- ret.appendValue(i, aix[k], val);
- }
+ if( a == null )
+ return;
+
+ //prepare second input and allocate output
+ MatrixBlock b = m1.sparse ? m2 : m1;
+ ret.allocateDenseOrSparseBlock();
+
+ for( int i=0; i<a.numRows(); i++ ) {
+ 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);
+ if( ret.sparse && !b.sparse )
+ ret.sparseBlock.allocate(i, alen);
+ for(int k = apos; k < apos+alen; k++) {
+ double in2 = b.quickGetValue(i, aix[k]);
+ if( in2==0 ) continue;
+ double val = op.fn.execute(avals[k], in2);
+ ret.appendValue(i, aix[k], val);
}
}
}