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 <[email protected]> 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; }
