You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@systemml.apache.org by mb...@apache.org on 2018/05/22 21:44:28 UTC
systemml git commit: [SYSTEMML-2247] Fix missing block merge large
dense blocks >16GB
Repository: systemml
Updated Branches:
refs/heads/master f7078c292 -> 4b6b8d2df
[SYSTEMML-2247] Fix missing block merge large dense blocks >16GB
This patch adds the missing support for large (i.e., partitioned) dense
blocks >16GB to the primitive for merging matrix blocks as used during
various distributed operations parfor result merge, where might work
with very large result variables.
Project: http://git-wip-us.apache.org/repos/asf/systemml/repo
Commit: http://git-wip-us.apache.org/repos/asf/systemml/commit/4b6b8d2d
Tree: http://git-wip-us.apache.org/repos/asf/systemml/tree/4b6b8d2d
Diff: http://git-wip-us.apache.org/repos/asf/systemml/diff/4b6b8d2d
Branch: refs/heads/master
Commit: 4b6b8d2df3510f51190b8550fbd7f603b248321d
Parents: f7078c2
Author: Matthias Boehm <mb...@gmail.com>
Authored: Tue May 22 13:48:57 2018 -0700
Committer: Matthias Boehm <mb...@gmail.com>
Committed: Tue May 22 14:44:51 2018 -0700
----------------------------------------------------------------------
.../sysml/runtime/matrix/data/MatrixBlock.java | 107 ++++++++++---------
1 file changed, 58 insertions(+), 49 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/systemml/blob/4b6b8d2d/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlock.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlock.java b/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlock.java
index 61a1086..78f4fde 100644
--- a/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlock.java
+++ b/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlock.java
@@ -1617,77 +1617,86 @@ public class MatrixBlock extends MatrixValue implements CacheBlock, Externalizab
nonZeros = nnz;
}
- private void mergeIntoDense(MatrixBlock that)
- {
+ private void mergeIntoDense(MatrixBlock that) {
+ DenseBlock a = getDenseBlock();
if( that.sparse ) { //DENSE <- SPARSE
- double[] a = getDenseBlockValues();
SparseBlock b = that.sparseBlock;
int m = rlen;
- int n = clen;
- for( int i=0, aix=0; i<m; i++, aix+=n ) {
+ for( int i=0; i<m; i++ ) {
if( b.isEmpty(i) ) continue;
int bpos = b.pos(i);
int blen = b.size(i);
int[] bix = b.indexes(i);
- double[] bval = b.values(i);
- for( int j=bpos; j<bpos+blen; j++ )
- if( bval[j] != 0 )
- a[ aix + bix[j] ] = bval[j];
+ double[] avals = a.values(i);
+ double[] bvals = b.values(i);
+ int aix = a.pos(i);
+ for( int j=bpos; j<bpos+blen; j++ ) {
+ double bval = bvals[j];
+ if( bval != 0 )
+ avals[aix+bix[j]] = bval;
+ }
}
}
else { //DENSE <- DENSE
- double[] a = getDenseBlockValues();
- double[] b = that.getDenseBlockValues();
- int len = rlen * clen;
- for( int i=0; i<len; i++ )
- a[i] = ( b[i] != 0 ) ? b[i] : a[i];
+ DenseBlock b = that.getDenseBlock();
+ for(int bi=0; bi<a.numBlocks(); bi++) {
+ double[] avals = a.valuesAt(bi);
+ double[] bvals = b.valuesAt(bi);
+ int blen = a.size(bi);
+ for( int j=0; j<blen; j++ )
+ avals[j] = bvals[j]!=0 ? bvals[j] : avals[j];
+ }
}
}
- private void mergeIntoDensePar(MatrixBlock that)
- {
+ private void mergeIntoDensePar(MatrixBlock that) {
+ DenseBlock a = getDenseBlock();
if( that.sparse ) { //DENSE <- SPARSE
- double[] a = getDenseBlockValues();
SparseBlock b = that.sparseBlock;
- IntStream.range(0, rlen).parallel().forEach(i -> {
- if( b.isEmpty(i) ) return;
- int aix = i*clen;
- int bpos = b.pos(i);
- int blen = b.size(i);
- int[] bix = b.indexes(i);
- double[] bval = b.values(i);
- for( int j=bpos; j<bpos+blen; j++ )
- if( bval[j] != 0 )
- a[ aix + bix[j] ] = bval[j];
- });
+ int roff = 0; //row offset
+ for( int bi=0; bi<a.numBlocks(); bi++ ) {
+ double[] avals = a.valuesAt(bi);
+ int alen = a.blockSize(bi);
+ final int lroff = roff; //final for lambda
+ IntStream.range(lroff, lroff+alen).parallel().forEach(i -> {
+ if( b.isEmpty(i) ) return;
+ int aix = (i-lroff)*clen;
+ int bpos = b.pos(i);
+ int blen = b.size(i);
+ int[] bix = b.indexes(i);
+ double[] bval = b.values(i);
+ for( int j=bpos; j<bpos+blen; j++ )
+ if( bval[j] != 0 )
+ avals[aix+bix[j]] = bval[j];
+ });
+ roff += alen;
+ }
}
else { //DENSE <- DENSE
- double[] a = getDenseBlockValues();
- double[] b = that.getDenseBlockValues();
- Arrays.parallelSetAll(a, i -> (b[i]!=0) ? b[i] : a[i]);
+ DenseBlock b = that.getDenseBlock();
+ for(int bi=0; bi<a.numBlocks(); bi++) {
+ double[] avals = a.valuesAt(bi);
+ double[] bvals = b.valuesAt(bi);
+ Arrays.parallelSetAll(avals,
+ i -> (bvals[i]!=0) ? bvals[i] : avals[i]);
+ }
}
}
- private void mergeIntoSparse(MatrixBlock that, boolean appendOnly)
- {
+ private void mergeIntoSparse(MatrixBlock that, boolean appendOnly) {
SparseBlock a = sparseBlock;
final boolean COO = (a instanceof SparseBlockCOO);
final int m = rlen;
final int n = clen;
-
- if( that.sparse ) //SPARSE <- SPARSE
- {
+ if( that.sparse ) { //SPARSE <- SPARSE
SparseBlock b = that.sparseBlock;
-
- for( int i=0; i<m; i++ )
- {
+ for( int i=0; i<m; i++ ) {
if( b.isEmpty(i) ) continue;
if( !COO && a.isEmpty(i) ) {
//copy entire sparse row (no sort required)
a.set(i, b.get(i), true);
}
- else
- {
+ else {
boolean appended = false;
int bpos = b.pos(i);
int blen = b.size(i);
@@ -1705,15 +1714,16 @@ public class MatrixBlock extends MatrixValue implements CacheBlock, Externalizab
}
}
}
- else //SPARSE <- DENSE
- {
- double[] b = that.getDenseBlockValues();
-
- for( int i=0, bix=0; i<m; i++, bix+=n ) {
+ else { //SPARSE <- DENSE
+ DenseBlock b = that.getDenseBlock();
+ for( int i=0; i<m; i++ ) {
+ double[] bvals = b.values(i);
+ int bix = b.pos(i);
boolean appended = false;
for( int j=0; j<n; j++ ) {
- if( b[bix+j] != 0 ) {
- appendValue(i, j, b[bix+j]); //incl alloc
+ double bval = bvals[bix+j];
+ if( bval != 0 ) {
+ appendValue(i, j, bval); //incl alloc
appended = true;
}
}
@@ -1722,7 +1732,6 @@ public class MatrixBlock extends MatrixValue implements CacheBlock, Externalizab
a.sort(i);
}
}
-
//full sort of coordinate blocks
if( COO && !appendOnly )
a.sort();