[SYSTEMML-1952] Fix codegen row ops w/ non-allocated dense side inputs This patch fixes special cases with empty (and not allocated) dense side inputs. Before we always converted sparse and empty dense inputs to dense blocks. With the introduction of sparse side inputs, the special case of empty dense blocks was not yet handled correctly. We now simply construct sparse side inputs and make these robust to work with non-existing sparse blocks.
Furthermore, this includes a minor performance improvement, where sparse row side inputs do not need to reset the temporary row for each access in case of non-existing sparse blocks. Project: http://git-wip-us.apache.org/repos/asf/systemml/repo Commit: http://git-wip-us.apache.org/repos/asf/systemml/commit/897d29d0 Tree: http://git-wip-us.apache.org/repos/asf/systemml/tree/897d29d0 Diff: http://git-wip-us.apache.org/repos/asf/systemml/diff/897d29d0 Branch: refs/heads/master Commit: 897d29d04a8d6b89a7467e65d350aa98362f67b0 Parents: dd513ff Author: Matthias Boehm <mboe...@gmail.com> Authored: Thu Oct 26 22:45:06 2017 -0700 Committer: Matthias Boehm <mboe...@gmail.com> Committed: Thu Oct 26 23:38:21 2017 -0700 ---------------------------------------------------------------------- .../sysml/runtime/codegen/SpoofOperator.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/systemml/blob/897d29d0/src/main/java/org/apache/sysml/runtime/codegen/SpoofOperator.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/codegen/SpoofOperator.java b/src/main/java/org/apache/sysml/runtime/codegen/SpoofOperator.java index a614ded..21fdd35 100644 --- a/src/main/java/org/apache/sysml/runtime/codegen/SpoofOperator.java +++ b/src/main/java/org/apache/sysml/runtime/codegen/SpoofOperator.java @@ -104,10 +104,10 @@ public abstract class SpoofOperator implements Serializable else { b[i-offset] = new SideInput(DataConverter.convertToDoubleVector(in), null, clen); LOG.warn(getClass().getName()+": Converted "+in.getNumRows()+"x"+in.getNumColumns()+ - ", nnz="+in.getNonZeros()+" sideways input matrix from sparse to dense."); + ", nnz="+in.getNonZeros()+" sideways input matrix from sparse to dense."); } } - else if( in.isInSparseFormat() && in.isAllocated() ) { + else if( in.isInSparseFormat() || !in.isAllocated() ) { b[i-offset] = new SideInput(null, in, clen); } else { @@ -128,16 +128,14 @@ public abstract class SpoofOperator implements Serializable boolean containsSparse = false; for( int i=0; i<input.length; i++ ) { SideInput tmp = input[i]; - containsSparse |= (tmp.mdat != null && tmp.mdat.isInSparseFormat() - && !tmp.mdat.isEmptyBlock(false) && tmp.clen > 1); + containsSparse |= (tmp.mdat != null && tmp.clen > 1); } if( !containsSparse ) return input; SideInput[] ret = new SideInput[input.length]; for( int i=0; i<input.length; i++ ) { SideInput tmp = input[i]; - ret[i] = (tmp.mdat != null && tmp.mdat.isInSparseFormat() - && !tmp.mdat.isEmptyBlock(false) && tmp.clen > 1) ? + ret[i] = (tmp.mdat != null && tmp.clen > 1) ? (row ? new SideInputSparseRow(tmp) : new SideInputSparseCell(tmp)) : tmp; } @@ -274,9 +272,10 @@ public abstract class SpoofOperator implements Serializable private void nextRow(int r) { currRowIndex = r; - Arrays.fill(values, 0); SparseBlock sblock = mdat.getSparseBlock(); - if( sblock != null && !sblock.isEmpty(r) ) { + if( sblock == null ) return; + Arrays.fill(values, 0); + if( !sblock.isEmpty(r) ) { int apos = sblock.pos(r); int alen = sblock.size(r); int[] aix = sblock.indexes(r); @@ -298,7 +297,8 @@ public abstract class SpoofOperator implements Serializable super(in.ddat, in.mdat, in.clen); } public double next(int rowIndex, int colIndex) { - if( mdat.getSparseBlock().isEmpty(rowIndex) ) + SparseBlock sblock = mdat.getSparseBlock(); + if( sblock == null || sblock.isEmpty(rowIndex) ) return 0; //move to next row if necessary if( rowIndex > currRowIndex ) {