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;
}