This is an automated email from the ASF dual-hosted git repository.

mboehm7 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/systemds.git


The following commit(s) were added to refs/heads/master by this push:
     new a3247d5  [MINOR] Avoid nnz maintenance in multi-threaded matrix-scalar 
ops
a3247d5 is described below

commit a3247d52f99aec95bdfdcb1cfabadd327d846222
Author: Matthias Boehm <[email protected]>
AuthorDate: Fri May 21 17:38:00 2021 +0200

    [MINOR] Avoid nnz maintenance in multi-threaded matrix-scalar ops
    
    The recent changes in SYSTEMDS-2604 also added missing multi-threading
    support for special operations such as 2* (for X+X) or 2^ (for X*X).
    This patch makes a small improvement of avoiding unnecessary redundant
    nnz maintenance in all matrix-scalar binary operations. Compared to
    allocation this gives only minor performance improvements.
---
 .../runtime/matrix/data/LibMatrixBincell.java      | 31 ++++++++++++----------
 1 file changed, 17 insertions(+), 14 deletions(-)

diff --git 
a/src/main/java/org/apache/sysds/runtime/matrix/data/LibMatrixBincell.java 
b/src/main/java/org/apache/sysds/runtime/matrix/data/LibMatrixBincell.java
index 161328e..c774170 100644
--- a/src/main/java/org/apache/sysds/runtime/matrix/data/LibMatrixBincell.java
+++ b/src/main/java/org/apache/sysds/runtime/matrix/data/LibMatrixBincell.java
@@ -1153,10 +1153,10 @@ public class LibMatrixBincell
                return lnnz;
        }
 
-       private static void safeBinaryScalar(MatrixBlock m1, MatrixBlock ret, 
ScalarOperator op, int rl, int ru) {
+       private static long safeBinaryScalar(MatrixBlock m1, MatrixBlock ret, 
ScalarOperator op, int rl, int ru) {
                //early abort possible since sparsesafe
                if( m1.isEmptyBlock(false) ) {
-                       return;
+                       return 0;
                }
                
                //sanity check input/output sparsity
@@ -1167,6 +1167,7 @@ public class LibMatrixBincell
                boolean allocExact = (op.fn instanceof Multiply || op.fn 
instanceof Multiply2 
                        || op.fn instanceof Power2 || 
Builtin.isBuiltinCode(op.fn, BuiltinCode.MAX)
                        || Builtin.isBuiltinCode(op.fn, BuiltinCode.MIN));
+               long lnnz = 0;
                
                if( m1.sparse ) //SPARSE <- SPARSE
                {
@@ -1207,11 +1208,13 @@ public class LibMatrixBincell
                                        }
                                }
                        }
-                       ret.nonZeros = nnz;
+                       lnnz = (ret.nonZeros = nnz);
                }
                else { //DENSE <- DENSE
-                       denseBinaryScalar(m1, ret, op, rl, ru);
+                       lnnz = denseBinaryScalar(m1, ret, op, rl, ru);
                }
+               
+               return lnnz;
        }
        
        /**
@@ -1221,14 +1224,14 @@ public class LibMatrixBincell
         * @param ret result matrix
         * @param op scalar operator
         */
-       private static void unsafeBinaryScalar(MatrixBlock m1, MatrixBlock ret, 
ScalarOperator op) {
+       private static long unsafeBinaryScalar(MatrixBlock m1, MatrixBlock ret, 
ScalarOperator op) {
                //early abort possible since sparsesafe
                if( m1.isEmptyBlock(false) ) {
                        //compute 0 op constant once and set into dense output
                        double val = op.executeScalar(0);
                        if( val != 0 )
                                ret.reset(ret.rlen, ret.clen, val);
-                       return;
+                       return (val != 0) ? ret.getLength() : 0;
                }
                
                //sanity check input/output sparsity
@@ -1237,6 +1240,7 @@ public class LibMatrixBincell
                
                int m = m1.rlen;
                int n = m1.clen;
+               long lnnz = 0;
                
                if( m1.sparse ) //SPARSE MATRIX
                {
@@ -1270,14 +1274,16 @@ public class LibMatrixBincell
                                        }
                                }
                        }
-                       ret.nonZeros = nnz;
+                       lnnz = (ret.nonZeros = nnz);
                }
                else { //DENSE MATRIX
-                       denseBinaryScalar(m1, ret, op, 0, m);
+                       lnnz = denseBinaryScalar(m1, ret, op, 0, m);
                }
+               
+               return lnnz;
        }
 
-       private static void denseBinaryScalar(MatrixBlock m1, MatrixBlock ret, 
ScalarOperator op, int rl, int ru) {
+       private static long denseBinaryScalar(MatrixBlock m1, MatrixBlock ret, 
ScalarOperator op, int rl, int ru) {
                //allocate dense block (if necessary), incl clear nnz
                ret.allocateDenseBlock(true);
                
@@ -1296,7 +1302,7 @@ public class LibMatrixBincell
                                nnz += (c[cpos+j] != 0) ? 1 : 0;
                        }
                }
-               ret.nonZeros = nnz;
+               return ret.nonZeros = nnz;
        }
 
        private static void safeBinaryInPlace(MatrixBlock m1ret, MatrixBlock 
m2, BinaryOperator op) {
@@ -1616,10 +1622,7 @@ public class LibMatrixBincell
                @Override
                public Long call() {
                        //execute binary operation on row partition
-                       safeBinaryScalar(_m1, _ret, _sop, _rl, _ru);
-                       
-                       //maintain block nnz (upper bounds inclusive)
-                       return _ret.recomputeNonZeros(_rl, _ru-1);
+                       return safeBinaryScalar(_m1, _ret, _sop, _rl, _ru);
                }
        }
 }

Reply via email to