You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@systemds.apache.org by mb...@apache.org on 2022/08/07 13:53:51 UTC

[systemds] 02/02: [SYSTEMDS-3418] Fix missing large block support in replace operations

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

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

commit 848878820589943fce6c5751d5ed04ca884a9a2d
Author: Matthias Boehm <mb...@gmail.com>
AuthorDate: Sun Aug 7 15:53:25 2022 +0200

    [SYSTEMDS-3418] Fix missing large block support in replace operations
    
    So far the existing sparse-dense and dense-dense replace operations only
    supported normal dense blocks with up to 16GB and thus failed on large
    multi-block dense blocks. This patch generalizes the existing kernels
    with negligible runtime overhead for small blocks.
---
 .../sysds/runtime/matrix/data/MatrixBlock.java     | 29 +++++++++++++---------
 1 file changed, 17 insertions(+), 12 deletions(-)

diff --git a/src/main/java/org/apache/sysds/runtime/matrix/data/MatrixBlock.java b/src/main/java/org/apache/sysds/runtime/matrix/data/MatrixBlock.java
index e2fa983343..d06d5a4177 100644
--- a/src/main/java/org/apache/sysds/runtime/matrix/data/MatrixBlock.java
+++ b/src/main/java/org/apache/sysds/runtime/matrix/data/MatrixBlock.java
@@ -5249,40 +5249,45 @@ public class MatrixBlock extends MatrixValue implements CacheBlock, Externalizab
 				ret.sparse = false;
 				ret.allocateDenseBlock();
 				SparseBlock a = sparseBlock;
-				double[] c = ret.getDenseBlockValues();
+				DenseBlock c = ret.getDenseBlock();
 				
 				//initialize with replacement (since all 0 values, see SPARSITY_TURN_POINT)
-				Arrays.fill(c, replacement);
+				c.reset(rlen, clen, replacement);
 				
 				//overwrite with existing values (via scatter)
 				if( a != null  ) //check for empty matrix
-					for( int i=0, cix=0; i<rlen; i++, cix+=clen ) {
+					for( int i=0; i<rlen; i++ ) {
 						if( !a.isEmpty(i) ) {
 							int apos = a.pos(i);
+							int cpos = c.pos(i);
 							int alen = a.size(i);
 							int[] aix = a.indexes(i);
 							double[] avals = a.values(i);
+							double[] cvals = c.values(i);
 							for( int j=apos; j<apos+alen; j++ )
 								if( avals[ j ] != 0 )
-									c[ cix+aix[j] ] = avals[ j ];
+									cvals[ cpos+aix[j] ] = avals[ j ];
 						}
 					}
 			}
 		}
 		else { //DENSE <- DENSE
-			int mn = ret.rlen * ret.clen;
-			ret.allocateDenseBlock();
-			double[] a = getDenseBlockValues();
-			double[] c = ret.getDenseBlockValues();
-			for( int i=0; i<mn; i++ ) {
-				c[i] = ( a[i]== pattern || (NaNpattern && Double.isNaN(a[i])) ) ?
-					replacement : a[i];
+			DenseBlock a = getDenseBlock();
+			DenseBlock c = ret.allocateDenseBlock().getDenseBlock();
+			for( int bi=0; bi<a.numBlocks(); bi++ ) {
+				int len = a.blockSize(bi);
+				double[] avals = a.valuesAt(bi);
+				double[] cvals = c.valuesAt(bi);
+				for( int i=0; i<len; i++ ) {
+					cvals[i] = (avals[i]== pattern 
+						|| (NaNpattern && Double.isNaN(avals[i]))) ?
+						replacement : avals[i];
+				}
 			}
 		}
 		
 		ret.recomputeNonZeros();
 		ret.examSparsity();
-		
 		return ret;
 	}