Repository: systemml Updated Branches: refs/heads/master dc3dfbe85 -> 728bf19ea
[MINOR] Fix performance dnn matrix multiply integration (nnz handling) This minor patch avoid unnecessary recomputation of the number of non-zeros for dense temporary inputs to our java matrix multiplications. On a single epoch of lenet over mnist, this improved performance slightly from 298s to 290s (average over 3 runs, w/ codegen enabled). Project: http://git-wip-us.apache.org/repos/asf/systemml/repo Commit: http://git-wip-us.apache.org/repos/asf/systemml/commit/1001b3fa Tree: http://git-wip-us.apache.org/repos/asf/systemml/tree/1001b3fa Diff: http://git-wip-us.apache.org/repos/asf/systemml/diff/1001b3fa Branch: refs/heads/master Commit: 1001b3faac4accdfbb5f98a39ac3233befe2d1d7 Parents: dc3dfbe Author: Matthias Boehm <[email protected]> Authored: Fri Jun 16 21:21:12 2017 -0700 Committer: Matthias Boehm <[email protected]> Committed: Sat Jun 17 13:11:33 2017 -0700 ---------------------------------------------------------------------- .../runtime/matrix/data/LibMatrixDNNHelper.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/systemml/blob/1001b3fa/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixDNNHelper.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixDNNHelper.java b/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixDNNHelper.java index 5a137cc..ab96a8e 100644 --- a/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixDNNHelper.java +++ b/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixDNNHelper.java @@ -302,10 +302,8 @@ public class LibMatrixDNNHelper { static void singleThreadedMatMult(MatrixBlock m1, MatrixBlock m2, MatrixBlock ret, boolean recomputeNNZM1, boolean recomputeNNZM2, ConvolutionParameters params) throws DMLRuntimeException { if(!params.enableNative || m1.isInSparseFormat() || m2.isInSparseFormat()) { - if(recomputeNNZM1) - m1.recomputeNonZeros(); - if(recomputeNNZM2) - m2.recomputeNonZeros(); + prepNonZerosForMatrixMult(m1, recomputeNNZM1); + prepNonZerosForMatrixMult(m2, recomputeNNZM2); LibMatrixMult.matrixMult(m1, m2, ret, false); } else { @@ -539,4 +537,15 @@ public class LibMatrixDNNHelper { } } } + + private static void prepNonZerosForMatrixMult(MatrixBlock mb, boolean update) { + if( !update ) + return; + //non-zeros are not evaluated for dense matrix multiplies + //so we simply need to ensure the block is not marked empty + if( !mb.isInSparseFormat() ) + mb.setNonZeros(mb.getNumRows() * mb.getNumColumns()); + else + mb.recomputeNonZeros(); + } }
