[SYSTEMML-2049] Basic runtime integration new dense block abstraction This patch modifies the entire matrix block runtime to use the new dense block abstraction. So far, we still do not support large-dense blocks as this requires a re-implementation of relevant operators. However, this basic integration enables an incremental (operation-wise) handling.
Project: http://git-wip-us.apache.org/repos/asf/systemml/repo Commit: http://git-wip-us.apache.org/repos/asf/systemml/commit/e6424695 Tree: http://git-wip-us.apache.org/repos/asf/systemml/tree/e6424695 Diff: http://git-wip-us.apache.org/repos/asf/systemml/diff/e6424695 Branch: refs/heads/master Commit: e642469550d888695f151fe6dd57b95159507a16 Parents: 9526f7d Author: Matthias Boehm <[email protected]> Authored: Sat Dec 9 00:45:03 2017 -0800 Committer: Matthias Boehm <[email protected]> Committed: Tue Dec 12 18:56:03 2017 -0800 ---------------------------------------------------------------------- .../sysml/parser/BuiltinFunctionExpression.java | 2 +- .../sysml/runtime/codegen/CodegenUtils.java | 2 +- .../sysml/runtime/codegen/SpoofCellwise.java | 86 ++- .../runtime/codegen/SpoofMultiAggregate.java | 6 +- .../sysml/runtime/codegen/SpoofOperator.java | 2 +- .../runtime/codegen/SpoofOuterProduct.java | 29 +- .../sysml/runtime/codegen/SpoofRowwise.java | 18 +- .../sysml/runtime/compress/ColGroupDDC.java | 2 +- .../sysml/runtime/compress/ColGroupDDC1.java | 14 +- .../sysml/runtime/compress/ColGroupDDC2.java | 10 +- .../sysml/runtime/compress/ColGroupOLE.java | 12 +- .../sysml/runtime/compress/ColGroupRLE.java | 12 +- .../runtime/compress/ColGroupUncompressed.java | 10 +- .../runtime/compress/CompressedMatrixBlock.java | 8 +- .../compress/utils/LinearAlgebraUtils.java | 2 +- .../runtime/controlprogram/ProgramBlock.java | 2 +- .../cp/ConvolutionCPInstruction.java | 9 +- .../cp/MatrixIndexingCPInstruction.java | 4 +- .../cp/MatrixMatrixBuiltinCPInstruction.java | 17 +- .../instructions/gpu/context/GPUObject.java | 7 +- .../mr/UaggOuterChainInstruction.java | 4 +- .../spark/ConvolutionSPInstruction.java | 3 +- .../spark/UaggOuterChainSPInstruction.java | 12 +- .../spark/utils/RDDConverterUtils.java | 2 +- .../spark/utils/RDDConverterUtilsExt.java | 2 +- .../runtime/io/ReaderTextCellParallel.java | 4 +- .../apache/sysml/runtime/io/WriterTextCell.java | 4 +- .../data/BinaryBlockToBinaryCellConverter.java | 2 +- .../data/BinaryBlockToTextCellConverter.java | 2 +- .../sysml/runtime/matrix/data/DenseBlock.java | 54 ++ .../runtime/matrix/data/DenseBlockDRB.java | 74 ++- .../runtime/matrix/data/DenseBlockFactory.java | 4 + .../runtime/matrix/data/DenseBlockLDRB.java | 70 +- .../runtime/matrix/data/LibCommonsMath.java | 6 +- .../sysml/runtime/matrix/data/LibMatrixAgg.java | 57 +- .../runtime/matrix/data/LibMatrixBincell.java | 36 +- .../sysml/runtime/matrix/data/LibMatrixDNN.java | 8 +- .../LibMatrixDNNConv2dBackwardDataHelper.java | 4 +- .../LibMatrixDNNConv2dBackwardFilterHelper.java | 10 +- .../matrix/data/LibMatrixDNNConv2dHelper.java | 27 +- .../runtime/matrix/data/LibMatrixDNNHelper.java | 21 +- .../matrix/data/LibMatrixDNNIm2ColHelper.java | 8 +- .../data/LibMatrixDNNPoolingBackwardHelper.java | 16 +- .../matrix/data/LibMatrixDNNPoolingHelper.java | 6 +- .../data/LibMatrixDNNRotate180Helper.java | 4 +- .../runtime/matrix/data/LibMatrixDatagen.java | 6 +- .../runtime/matrix/data/LibMatrixMult.java | 154 +++-- .../runtime/matrix/data/LibMatrixNative.java | 16 +- .../runtime/matrix/data/LibMatrixOuterAgg.java | 48 +- .../runtime/matrix/data/LibMatrixReorg.java | 71 +- .../sysml/runtime/matrix/data/MatrixBlock.java | 640 +++++++++---------- .../sysml/runtime/util/ConvolutionUtils.java | 6 +- .../sysml/runtime/util/DataConverter.java | 27 +- .../util/FastBufferedDataOutputStream.java | 20 +- .../apache/sysml/runtime/util/SortUtils.java | 2 +- .../org/apache/sysml/udf/lib/CumSumProd.java | 8 +- .../apache/sysml/udf/lib/MultiInputCbind.java | 4 +- .../org/apache/sysml/udf/lib/RowClassMeet.java | 6 +- .../apache/sysml/udf/lib/SGDNesterovUpdate.java | 20 +- .../scala/org/apache/sysml/api/dl/Utils.scala | 4 +- .../codegen/CPlanVectorPrimitivesTest.java | 12 +- .../unary/matrix/SVDFactorizeTest.java | 14 +- 62 files changed, 941 insertions(+), 811 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/parser/BuiltinFunctionExpression.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/parser/BuiltinFunctionExpression.java b/src/main/java/org/apache/sysml/parser/BuiltinFunctionExpression.java index db1b638..ab6fb54 100644 --- a/src/main/java/org/apache/sysml/parser/BuiltinFunctionExpression.java +++ b/src/main/java/org/apache/sysml/parser/BuiltinFunctionExpression.java @@ -1291,7 +1291,7 @@ public class BuiltinFunctionExpression extends DataIdentifier } Expression [] temp = _args.clone(); _args = new Expression[_args.length + 1]; - System.arraycopy(temp, 0, _args, 0, temp.length); + System.arraycopy(temp, 0, _args, 0, temp.length); } @Override http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/codegen/CodegenUtils.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/codegen/CodegenUtils.java b/src/main/java/org/apache/sysml/runtime/codegen/CodegenUtils.java index 726e267..2e84eae 100644 --- a/src/main/java/org/apache/sysml/runtime/codegen/CodegenUtils.java +++ b/src/main/java/org/apache/sysml/runtime/codegen/CodegenUtils.java @@ -170,7 +170,7 @@ public class CodegenUtils public static SideInput createSideInput(MatrixBlock in) { SideInput ret = (in.isInSparseFormat() || !in.isAllocated()) ? new SideInput(null, in, in.getNumColumns()) : - new SideInput(in.getDenseBlock(), null, in.getNumColumns()); + new SideInput(in.getDenseBlockValues(), null, in.getNumColumns()); return (ret.mdat != null) ? new SideInputSparseCell(ret) : ret; } http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/codegen/SpoofCellwise.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/codegen/SpoofCellwise.java b/src/main/java/org/apache/sysml/runtime/codegen/SpoofCellwise.java index 5acd5b4..8c7e14d 100644 --- a/src/main/java/org/apache/sysml/runtime/codegen/SpoofCellwise.java +++ b/src/main/java/org/apache/sysml/runtime/codegen/SpoofCellwise.java @@ -44,6 +44,7 @@ import org.apache.sysml.runtime.functionobjects.ValueFunction; import org.apache.sysml.runtime.instructions.cp.DoubleObject; import org.apache.sysml.runtime.instructions.cp.KahanObject; import org.apache.sysml.runtime.instructions.cp.ScalarObject; +import org.apache.sysml.runtime.matrix.data.DenseBlock; import org.apache.sysml.runtime.matrix.data.IJV; import org.apache.sysml.runtime.matrix.data.LibMatrixMult; import org.apache.sysml.runtime.matrix.data.MatrixBlock; @@ -260,15 +261,15 @@ public abstract class SpoofCellwise extends SpoofOperator implements Serializabl lnnz += task.get(); if( _type == CellType.COL_AGG ) { //aggregate partial results - double[] c = out.getDenseBlock(); + double[] c = out.getDenseBlockValues(); ValueFunction vfun = getAggFunction(); if( vfun instanceof KahanFunction ) { for( ParExecTask task : tasks ) - LibMatrixMult.vectAdd(task.getResult().getDenseBlock(), c, 0, 0, n); + LibMatrixMult.vectAdd(task.getResult().getDenseBlockValues(), c, 0, 0, n); } else { for( ParExecTask task : tasks ) { - double[] tmp = task.getResult().getDenseBlock(); + double[] tmp = task.getResult().getDenseBlockValues(); for(int j=0; j<n; j++) c[j] = vfun.execute(c[j], tmp[j]); } @@ -290,11 +291,11 @@ public abstract class SpoofCellwise extends SpoofOperator implements Serializabl ///////// //function dispatch - private long executeDense(double[] a, SideInput[] b, double[] scalars, + private long executeDense(DenseBlock a, SideInput[] b, double[] scalars, MatrixBlock out, int m, int n, boolean sparseSafe, int rl, int ru) throws DMLRuntimeException { - double[] c = out.getDenseBlock(); + double[] c = out.getDenseBlockValues(); SideInput[] lb = createSparseSideInputs(b); if( _type == CellType.NO_AGG ) { @@ -315,7 +316,7 @@ public abstract class SpoofCellwise extends SpoofOperator implements Serializabl return -1; } - private double executeDenseAndAgg(double[] a, SideInput[] b, double[] scalars, + private double executeDenseAndAgg(DenseBlock a, SideInput[] b, double[] scalars, int m, int n, boolean sparseSafe, int rl, int ru) throws DMLRuntimeException { SideInput[] lb = createSparseSideInputs(b); @@ -385,14 +386,14 @@ public abstract class SpoofCellwise extends SpoofOperator implements Serializabl return lnnz; } else if( _type == CellType.ROW_AGG ) { - double[] c = out.getDenseBlock(); + double[] c = out.getDenseBlockValues(); if( _aggOp == AggOp.SUM || _aggOp == AggOp.SUM_SQ ) return executeCompressedRowAggSum(a, b, scalars, c, m, n, sparseSafe, rl, ru); else return executeCompressedRowAggMxx(a, b, scalars, c, m, n, sparseSafe, rl, ru); } else if( _type == CellType.COL_AGG ) { - double[] c = out.getDenseBlock(); + double[] c = out.getDenseBlockValues(); if( _aggOp == AggOp.SUM || _aggOp == AggOp.SUM_SQ ) return executeCompressedColAggSum(a, b, scalars, c, m, n, sparseSafe, rl, ru); else @@ -417,14 +418,16 @@ public abstract class SpoofCellwise extends SpoofOperator implements Serializabl ///////// //core operator skeletons for dense, sparse, and compressed - private long executeDenseNoAgg(double[] a, SideInput[] b, double[] scalars, + private long executeDenseNoAgg(DenseBlock a, SideInput[] b, double[] scalars, double[] c, int m, int n, boolean sparseSafe, int rl, int ru) throws DMLRuntimeException { + double[] data = (a != null) ? a.values(0) : null; + long lnnz = 0; for( int i=rl, ix=rl*n; i<ru; i++ ) for( int j=0; j<n; j++, ix++ ) { - double aval = (a != null) ? a[ix] : 0; + double aval = (data != null) ? data[ix] : 0; if( aval != 0 || !sparseSafe) { c[ix] = genexec( aval, b, scalars, m, n, i, j); lnnz += (c[ix]!=0) ? 1 : 0; @@ -433,16 +436,18 @@ public abstract class SpoofCellwise extends SpoofOperator implements Serializabl return lnnz; } - private long executeDenseRowAggSum(double[] a, SideInput[] b, double[] scalars, + private long executeDenseRowAggSum(DenseBlock a, SideInput[] b, double[] scalars, double[] c, int m, int n, boolean sparseSafe, int rl, int ru) { + double[] data = (a != null) ? a.values(0) : null; + KahanFunction kplus = (KahanFunction) getAggFunction(); KahanObject kbuff = new KahanObject(0, 0); long lnnz = 0; for( int i=rl, ix=rl*n; i<ru; i++ ) { kbuff.set(0, 0); for( int j=0; j<n; j++, ix++ ) { - double aval = (a != null) ? a[ix] : 0; + double aval = (data != null) ? data[ix] : 0; if( aval != 0 || !sparseSafe) kplus.execute2(kbuff, genexec(aval, b, scalars, m, n, i, j)); } @@ -451,14 +456,16 @@ public abstract class SpoofCellwise extends SpoofOperator implements Serializabl return lnnz; } - private long executeDenseRowAggMxx(double[] a, SideInput[] b, double[] scalars, + private long executeDenseRowAggMxx(DenseBlock a, SideInput[] b, double[] scalars, double[] c, int m, int n, boolean sparseSafe, int rl, int ru) throws DMLRuntimeException { + double[] data = (a != null) ? a.values(0) : null; + double initialVal = (_aggOp==AggOp.MIN) ? Double.MAX_VALUE : -Double.MAX_VALUE; ValueFunction vfun = getAggFunction(); long lnnz = 0; - if( a == null && !sparseSafe ) { //empty + if( data == null && !sparseSafe ) { //empty for( int i=rl; i<ru; i++ ) { double tmp = initialVal; for( int j=0; j<n; j++ ) @@ -466,13 +473,13 @@ public abstract class SpoofCellwise extends SpoofOperator implements Serializabl lnnz += ((c[i] = tmp)!=0) ? 1 : 0; } } - else if( a != null ) { //general case + else if( data != null ) { //general case for( int i=rl, ix=rl*n; i<ru; i++ ) { double tmp = initialVal; for( int j=0; j<n; j++, ix++ ) - if( a[ix] != 0 || !sparseSafe) - tmp = vfun.execute(tmp, genexec(a[ix], b, scalars, m, n, i, j)); - if( sparseSafe && UtilFunctions.containsZero(a, ix-n, n) ) + if( data[ix] != 0 || !sparseSafe) + tmp = vfun.execute(tmp, genexec(data[ix], b, scalars, m, n, i, j)); + if( sparseSafe && UtilFunctions.containsZero(data, ix-n, n) ) tmp = vfun.execute(tmp, 0); lnnz += ((c[i] = tmp)!=0) ? 1 : 0; } @@ -480,16 +487,18 @@ public abstract class SpoofCellwise extends SpoofOperator implements Serializabl return lnnz; } - private long executeDenseColAggSum(double[] a, SideInput[] b, double[] scalars, + private long executeDenseColAggSum(DenseBlock a, SideInput[] b, double[] scalars, double[] c, int m, int n, boolean sparseSafe, int rl, int ru) { + double[] data = (a != null) ? a.values(0) : null; + KahanFunction kplus = (KahanFunction) getAggFunction(); KahanObject kbuff = new KahanObject(0, 0); double[] corr = new double[n]; for( int i=rl, ix=rl*n; i<ru; i++ ) for( int j=0; j<n; j++, ix++ ) { - double aval = (a != null) ? a[ix] : 0; + double aval = (data != null) ? data[ix] : 0; if( aval != 0 || !sparseSafe) { kbuff.set(c[j], corr[j]); kplus.execute2(kbuff, genexec(aval, b, scalars, m, n, i, j)); @@ -500,25 +509,27 @@ public abstract class SpoofCellwise extends SpoofOperator implements Serializabl return -1; } - private long executeDenseColAggMxx(double[] a, SideInput[] b, double[] scalars, + private long executeDenseColAggMxx(DenseBlock a, SideInput[] b, double[] scalars, double[] c, int m, int n, boolean sparseSafe, int rl, int ru) throws DMLRuntimeException { + double[] data = (a != null) ? a.values(0) : null; + double initialVal = (_aggOp==AggOp.MIN) ? Double.MAX_VALUE : -Double.MAX_VALUE; ValueFunction vfun = getAggFunction(); Arrays.fill(c, initialVal); - if( a == null && !sparseSafe ) { //empty + if( data == null && !sparseSafe ) { //empty for( int i=rl; i<ru; i++ ) for( int j=0; j<n; j++ ) c[j] = vfun.execute(c[j], genexec(0, b, scalars, m, n, i, j)); } - else if( a != null ) { //general case + else if( data != null ) { //general case int[] counts = new int[n]; for( int i=rl, ix=rl*n; i<ru; i++ ) for( int j=0; j<n; j++, ix++ ) - if( a[ix] != 0 || !sparseSafe) { - c[j] = vfun.execute(c[j], genexec(a[ix], b, scalars, m, n, i, j)); + if( data[ix] != 0 || !sparseSafe) { + c[j] = vfun.execute(c[j], genexec(data[ix], b, scalars, m, n, i, j)); counts[j] ++; } if( sparseSafe ) @@ -529,26 +540,30 @@ public abstract class SpoofCellwise extends SpoofOperator implements Serializabl return -1; } - private double executeDenseAggSum(double[] a, SideInput[] b, double[] scalars, + private double executeDenseAggSum(DenseBlock a, SideInput[] b, double[] scalars, int m, int n, boolean sparseSafe, int rl, int ru) throws DMLRuntimeException { + double[] data = (a != null) ? a.values(0) : null; + KahanFunction kplus = (KahanFunction) getAggFunction(); KahanObject kbuff = new KahanObject(0, 0); for( int i=rl, ix=rl*n; i<ru; i++ ) for( int j=0; j<n; j++, ix++ ) { - double aval = (a != null) ? a[ix] : 0; + double aval = (data != null) ? data[ix] : 0; if( aval != 0 || !sparseSafe) kplus.execute2(kbuff, genexec(aval, b, scalars, m, n, i, j)); } return kbuff._sum; } - private double executeDenseAggMxx(double[] a, SideInput[] b, double[] scalars, + private double executeDenseAggMxx(DenseBlock a, SideInput[] b, double[] scalars, int m, int n, boolean sparseSafe, int rl, int ru) throws DMLRuntimeException { + double[] data = (a != null) ? a.values(0) : null; + //safe aggregation for min/max w/ handling of zero entries //note: sparse safe with zero value as min/max handled outside double ret = (_aggOp==AggOp.MIN) ? Double.MAX_VALUE : -Double.MAX_VALUE; @@ -556,7 +571,7 @@ public abstract class SpoofCellwise extends SpoofOperator implements Serializabl for( int i=rl, ix=rl*n; i<ru; i++ ) for( int j=0; j<n; j++, ix++ ) { - double aval = (a != null) ? a[ix] : 0; + double aval = (data != null) ? data[ix] : 0; if( aval != 0 || !sparseSafe) ret = vfun.execute(ret, genexec(aval, b, scalars, m, n, i, j)); } @@ -606,7 +621,7 @@ public abstract class SpoofCellwise extends SpoofOperator implements Serializabl { //note: sequential scan algorithm for both sparse-safe and -unsafe //in order to avoid binary search for sparse-unsafe - double[] c = out.getDenseBlock(); + double[] c = out.getDenseBlockValues(); long lnnz = 0; for(int i=rl, cix=rl*n; i<ru; i++, cix+=n) { int lastj = -1; @@ -643,7 +658,7 @@ public abstract class SpoofCellwise extends SpoofOperator implements Serializabl //note: sequential scan algorithm for both sparse-safe and -unsafe //in order to avoid binary search for sparse-unsafe - double[] c = out.getDenseBlock(); + double[] c = out.getDenseBlockValues(); long lnnz = 0; for(int i=rl; i<ru; i++) { kbuff.set(0, 0); @@ -682,7 +697,7 @@ public abstract class SpoofCellwise extends SpoofOperator implements Serializabl //note: sequential scan algorithm for both sparse-safe and -unsafe //in order to avoid binary search for sparse-unsafe - double[] c = out.getDenseBlock(); + double[] c = out.getDenseBlockValues(); long lnnz = 0; for(int i=rl; i<ru; i++) { double tmp = (sparseSafe && sblock.size(i) < n) ? 0 : initialVal; @@ -722,7 +737,7 @@ public abstract class SpoofCellwise extends SpoofOperator implements Serializabl //note: sequential scan algorithm for both sparse-safe and -unsafe //in order to avoid binary search for sparse-unsafe - double[] c = out.getDenseBlock(); + double[] c = out.getDenseBlockValues(); for(int i=rl; i<ru; i++) { kbuff.set(0, 0); int lastj = -1; @@ -767,7 +782,7 @@ public abstract class SpoofCellwise extends SpoofOperator implements Serializabl { double initialVal = (_aggOp==AggOp.MIN) ? Double.MAX_VALUE : -Double.MAX_VALUE; ValueFunction vfun = getAggFunction(); - double[] c = out.getDenseBlock(); + double[] c = out.getDenseBlockValues(); Arrays.fill(c, initialVal); int[] count = new int[n]; @@ -878,7 +893,8 @@ public abstract class SpoofCellwise extends SpoofOperator implements Serializabl MatrixBlock out, int m, int n, boolean sparseSafe, int rl, int ru) throws DMLRuntimeException { - double[] c = out.getDenseBlock(); + double[] c = (out.getDenseBlock() != null) ? + out.getDenseBlockValues() : null; SparseBlock csblock = out.getSparseBlock(); //preallocate sparse rows to avoid reallocations http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/codegen/SpoofMultiAggregate.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/codegen/SpoofMultiAggregate.java b/src/main/java/org/apache/sysml/runtime/codegen/SpoofMultiAggregate.java index 64dd5c5..c141b2d 100644 --- a/src/main/java/org/apache/sysml/runtime/codegen/SpoofMultiAggregate.java +++ b/src/main/java/org/apache/sysml/runtime/codegen/SpoofMultiAggregate.java @@ -94,7 +94,7 @@ public abstract class SpoofMultiAggregate extends SpoofOperator implements Seria //result allocation and preparations out.reset(1, _aggOps.length, false); out.allocateDenseBlock(); - double[] c = out.getDenseBlock(); + double[] c = out.getDenseBlockValues(); setInitialOutputValues(c); //input preparation @@ -109,7 +109,7 @@ public abstract class SpoofMultiAggregate extends SpoofOperator implements Seria if( inputs.get(0) instanceof CompressedMatrixBlock ) executeCompressed((CompressedMatrixBlock)inputs.get(0), b, scalars, c, m, n, 0, m); else if( !inputs.get(0).isInSparseFormat() ) - executeDense(inputs.get(0).getDenseBlock(), b, scalars, c, m, n, 0, m); + executeDense(inputs.get(0).getDenseBlockValues(), b, scalars, c, m, n, 0, m); else executeSparse(inputs.get(0).getSparseBlock(), b, scalars, c, m, n, sparseSafe, 0, m); } @@ -307,7 +307,7 @@ public abstract class SpoofMultiAggregate extends SpoofOperator implements Seria if( _a instanceof CompressedMatrixBlock ) executeCompressed((CompressedMatrixBlock)_a, _b, _scalars, c, _rlen, _clen, _rl, _ru); else if( !_a.isInSparseFormat() ) - executeDense(_a.getDenseBlock(), _b, _scalars, c, _rlen, _clen, _rl, _ru); + executeDense(_a.getDenseBlockValues(), _b, _scalars, c, _rlen, _clen, _rl, _ru); else executeSparse(_a.getSparseBlock(), _b, _scalars, c, _rlen, _clen, _safe, _rl, _ru); return c; http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/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 4505c3e..2267a47 100644 --- a/src/main/java/org/apache/sysml/runtime/codegen/SpoofOperator.java +++ b/src/main/java/org/apache/sysml/runtime/codegen/SpoofOperator.java @@ -112,7 +112,7 @@ public abstract class SpoofOperator implements Serializable } else { b[i-offset] = new SideInput( - in.getDenseBlock(), null, clen); + in.getDenseBlockValues(), null, clen); } } http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/codegen/SpoofOuterProduct.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/codegen/SpoofOuterProduct.java b/src/main/java/org/apache/sysml/runtime/codegen/SpoofOuterProduct.java index e99ebe1..6919655 100644 --- a/src/main/java/org/apache/sysml/runtime/codegen/SpoofOuterProduct.java +++ b/src/main/java/org/apache/sysml/runtime/codegen/SpoofOuterProduct.java @@ -97,10 +97,10 @@ public abstract class SpoofOuterProduct extends SpoofOperator if( a instanceof CompressedMatrixBlock ) executeCellwiseCompressed((CompressedMatrixBlock)a, ab[0], ab[1], b, scalars, out, m, n, k, _outerProductType, 0, m, 0, n); else if( !a.isInSparseFormat() ) - executeCellwiseDense(a.getDenseBlock(), ab[0], ab[1], b, scalars, out.getDenseBlock(), m, n, k, _outerProductType, 0, m, 0, n); + executeCellwiseDense(a.getDenseBlockValues(), ab[0], ab[1], b, scalars, out.getDenseBlockValues(), m, n, k, _outerProductType, 0, m, 0, n); else executeCellwiseSparse(a.getSparseBlock(), ab[0], ab[1], b, scalars, out, m, n, k, a.getNonZeros(), _outerProductType, 0, m, 0, n); - return new DoubleObject(out.getDenseBlock()[0]); + return new DoubleObject(out.getDenseBlock().get(0, 0)); } @Override @@ -200,19 +200,19 @@ public abstract class SpoofOuterProduct extends SpoofOperator case LEFT_OUTER_PRODUCT: case RIGHT_OUTER_PRODUCT: if( a instanceof CompressedMatrixBlock ) - executeCompressed((CompressedMatrixBlock)a, ab[0], ab[1], b, scalars, out.getDenseBlock(), + executeCompressed((CompressedMatrixBlock)a, ab[0], ab[1], b, scalars, out.getDenseBlockValues(), m, n, k, _outerProductType, 0, m, 0, ((CompressedMatrixBlock)a).getNumColGroups()); else if( !a.isInSparseFormat() ) - executeDense(a.getDenseBlock(), ab[0], ab[1], b, scalars, out.getDenseBlock(), m, n, k, _outerProductType, 0, m, 0, n); + executeDense(a.getDenseBlockValues(), ab[0], ab[1], b, scalars, out.getDenseBlockValues(), m, n, k, _outerProductType, 0, m, 0, n); else - executeSparse(a.getSparseBlock(), ab[0], ab[1], b, scalars, out.getDenseBlock(), m, n, k, a.getNonZeros(), _outerProductType, 0, m, 0, n); + executeSparse(a.getSparseBlock(), ab[0], ab[1], b, scalars, out.getDenseBlockValues(), m, n, k, a.getNonZeros(), _outerProductType, 0, m, 0, n); break; case CELLWISE_OUTER_PRODUCT: if( a instanceof CompressedMatrixBlock ) executeCellwiseCompressed((CompressedMatrixBlock)a, ab[0], ab[1], b, scalars, out, m, n, k, _outerProductType, 0, m, 0, n); else if( !a.isInSparseFormat() ) - executeCellwiseDense(a.getDenseBlock(), ab[0], ab[1], b, scalars, out.getDenseBlock(), m, n, k, _outerProductType, 0, m, 0, n); + executeCellwiseDense(a.getDenseBlockValues(), ab[0], ab[1], b, scalars, out.getDenseBlockValues(), m, n, k, _outerProductType, 0, m, 0, n); else executeCellwiseSparse(a.getSparseBlock(), ab[0], ab[1], b, scalars, out, m, n, k, a.getNonZeros(), _outerProductType, 0, m, 0, n); break; @@ -485,7 +485,7 @@ public abstract class SpoofOuterProduct extends SpoofOperator if( !out.isInSparseFormat() ) //DENSE { - double[] c = out.getDenseBlock(); + double[] c = out.getDenseBlockValues(); double tmp = 0; for( int bi=rl; bi<ru; bi+=blocksizeIJ ) { int bimin = Math.min(ru, bi+blocksizeIJ); @@ -569,7 +569,8 @@ public abstract class SpoofOuterProduct extends SpoofOperator //NOTE: we don't create sparse side inputs w/ row-major cursors because //compressed data is access in a column-major order - double[] c = out.getDenseBlock(); + double[] c = (out.getDenseBlock() != null) ? + out.getDenseBlockValues() : null; SparseBlock csblock = out.getSparseBlock(); Iterator<IJV> iter = a.getIterator(rl, ru, false); @@ -641,17 +642,17 @@ public abstract class SpoofOuterProduct extends SpoofOperator case LEFT_OUTER_PRODUCT: case RIGHT_OUTER_PRODUCT: if( _a instanceof CompressedMatrixBlock ) - executeCompressed((CompressedMatrixBlock)_a, _u, _v, _b, _scalars, _c.getDenseBlock(), _rlen, _clen, _k, _type, _rl, _ru, _cl, _cu); + executeCompressed((CompressedMatrixBlock)_a, _u, _v, _b, _scalars, _c.getDenseBlockValues(), _rlen, _clen, _k, _type, _rl, _ru, _cl, _cu); else if( !_a.isInSparseFormat() ) - executeDense(_a.getDenseBlock(), _u, _v, _b, _scalars, _c.getDenseBlock(), _rlen, _clen, _k, _type, _rl, _ru, _cl, _cu); + executeDense(_a.getDenseBlockValues(), _u, _v, _b, _scalars, _c.getDenseBlockValues(), _rlen, _clen, _k, _type, _rl, _ru, _cl, _cu); else - executeSparse(_a.getSparseBlock(), _u, _v, _b, _scalars, _c.getDenseBlock(), _rlen, _clen, _k, _a.getNonZeros(), _type, _rl, _ru, _cl, _cu); + executeSparse(_a.getSparseBlock(), _u, _v, _b, _scalars, _c.getDenseBlockValues(), _rlen, _clen, _k, _a.getNonZeros(), _type, _rl, _ru, _cl, _cu); break; case CELLWISE_OUTER_PRODUCT: if( _a instanceof CompressedMatrixBlock ) executeCellwiseCompressed((CompressedMatrixBlock)_a, _u, _v, _b, _scalars, _c, _rlen, _clen, _k, _type, _rl, _ru, _cl, _cu); else if( !_c.isInSparseFormat() ) - executeCellwiseDense(_a.getDenseBlock(), _u, _v, _b, _scalars, _c.getDenseBlock(), _rlen, _clen, _k, _type, _rl, _ru, _cl, _cu); + executeCellwiseDense(_a.getDenseBlockValues(), _u, _v, _b, _scalars, _c.getDenseBlockValues(), _rlen, _clen, _k, _type, _rl, _ru, _cl, _cu); else executeCellwiseSparse(_a.getSparseBlock(), _u, _v, _b, _scalars, _c, _rlen, _clen, _k, _a.getNonZeros(), _type, _rl, _ru, _cl, _cu); break; @@ -706,10 +707,10 @@ public abstract class SpoofOuterProduct extends SpoofOperator if( _a instanceof CompressedMatrixBlock ) executeCellwiseCompressed((CompressedMatrixBlock)_a, _u, _v, _b, _scalars, out, _rlen, _clen, _k, _type, _rl, _ru, _cl, _cu); else if( !_a.isInSparseFormat() ) - executeCellwiseDense(_a.getDenseBlock(), _u, _v, _b, _scalars, out.getDenseBlock(), _rlen, _clen, _k, _type, _rl, _ru, _cl, _cu); + executeCellwiseDense(_a.getDenseBlockValues(), _u, _v, _b, _scalars, out.getDenseBlockValues(), _rlen, _clen, _k, _type, _rl, _ru, _cl, _cu); else executeCellwiseSparse(_a.getSparseBlock(), _u, _v, _b, _scalars, out, _rlen, _clen, _k, _a.getNonZeros(), _type, _rl, _ru, _cl, _cu); - return out.getDenseBlock()[0]; + return out.quickGetValue(0, 0); } } } http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/codegen/SpoofRowwise.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/codegen/SpoofRowwise.java b/src/main/java/org/apache/sysml/runtime/codegen/SpoofRowwise.java index 150b45e..c40be9f 100644 --- a/src/main/java/org/apache/sysml/runtime/codegen/SpoofRowwise.java +++ b/src/main/java/org/apache/sysml/runtime/codegen/SpoofRowwise.java @@ -33,6 +33,7 @@ import org.apache.sysml.runtime.compress.BitmapEncoder; import org.apache.sysml.runtime.compress.CompressedMatrixBlock; import org.apache.sysml.runtime.instructions.cp.DoubleObject; import org.apache.sysml.runtime.instructions.cp.ScalarObject; +import org.apache.sysml.runtime.matrix.data.DenseBlock; import org.apache.sysml.runtime.matrix.data.LibMatrixMult; import org.apache.sysml.runtime.matrix.data.LibMatrixReorg; import org.apache.sysml.runtime.matrix.data.MatrixBlock; @@ -137,7 +138,7 @@ public abstract class SpoofRowwise extends SpoofOperator getMinColsMatrixSideInputs(inputs) : -1; if( !aggIncr || !out.isAllocated() ) allocateOutputMatrix(m, n, n2, out); - double[] c = out.getDenseBlock(); + double[] c = out.getDenseBlockValues(); final boolean flipOut = _type.isRowTypeB1ColumnAgg() && LibSpoofPrimitives.isFlipOuter(out.getNumRows(), out.getNumColumns()); @@ -218,7 +219,7 @@ public abstract class SpoofRowwise extends SpoofOperator //aggregate partial results int len = _type.isColumnAgg() ? out.getNumRows()*out.getNumColumns() : 1; for( Future<double[]> task : taskret ) - LibMatrixMult.vectAdd(task.get(), out.getDenseBlock(), 0, 0, len); + LibMatrixMult.vectAdd(task.get(), out.getDenseBlockValues(), 0, 0, len); out.recomputeNonZeros(); } else { @@ -286,15 +287,16 @@ public abstract class SpoofRowwise extends SpoofOperator out.setNumColumns(rlen); } - private void executeDense(double[] a, SideInput[] b, double[] scalars, double[] c, int n, int rl, int ru) + private void executeDense(DenseBlock a, SideInput[] b, double[] scalars, double[] c, int n, int rl, int ru) { - if( a == null ) + double[] data = (a != null) ? a.values(0) : null; + if( data == null ) return; SideInput[] lb = createSparseSideInputs(b, true); for( int i=rl, aix=rl*n; i<ru; i++, aix+=n ) { //call generated method - genexec( a, aix, lb, scalars, c, n, i ); + genexec( data, aix, lb, scalars, c, n, i ); } } @@ -414,11 +416,11 @@ public abstract class SpoofRowwise extends SpoofOperator LibSpoofPrimitives.setupThreadLocalMemory(_reqVectMem, _clen, _clen2); if( _a instanceof CompressedMatrixBlock ) - executeCompressed((CompressedMatrixBlock)_a, _b, _scalars, _c.getDenseBlock(), _clen, _rl, _ru); + executeCompressed((CompressedMatrixBlock)_a, _b, _scalars, _c.getDenseBlockValues(), _clen, _rl, _ru); else if( !_a.isInSparseFormat() ) - executeDense(_a.getDenseBlock(), _b, _scalars, _c.getDenseBlock(), _clen, _rl, _ru); + executeDense(_a.getDenseBlock(), _b, _scalars, _c.getDenseBlockValues(), _clen, _rl, _ru); else - executeSparse(_a.getSparseBlock(), _b, _scalars, _c.getDenseBlock(), _clen, _rl, _ru); + executeSparse(_a.getSparseBlock(), _b, _scalars, _c.getDenseBlockValues(), _clen, _rl, _ru); if( _reqVectMem > 0 ) LibSpoofPrimitives.cleanupThreadLocalMemory(); http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC.java b/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC.java index d261f96..9973ec2 100644 --- a/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC.java +++ b/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC.java @@ -194,7 +194,7 @@ public abstract class ColGroupDDC extends ColGroupValue } protected void computeRowMxx(MatrixBlock result, Builtin builtin, int rl, int ru) { - double[] c = result.getDenseBlock(); + double[] c = result.getDenseBlockValues(); int ncol = getNumCols(); for( int i=rl; i<ru; i++ ) http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC1.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC1.java b/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC1.java index 63ab3e7..e14f27f 100644 --- a/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC1.java +++ b/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC1.java @@ -195,7 +195,7 @@ public class ColGroupDDC1 extends ColGroupDDC public void decompressToBlock(MatrixBlock target, int colpos) { int nrow = getNumRows(); int ncol = getNumCols(); - double[] c = target.getDenseBlock(); + double[] c = target.getDenseBlockValues(); int nnz = 0; for( int i = 0; i < nrow; i++ ) nnz += ((c[i] = _values[(_data[i]&0xFF)*ncol+colpos])!=0) ? 1 : 0; @@ -237,7 +237,7 @@ public class ColGroupDDC1 extends ColGroupDDC throws DMLRuntimeException { double[] b = ConverterUtils.getDenseVector(vector); - double[] c = result.getDenseBlock(); + double[] c = result.getDenseBlockValues(); final int numCols = getNumCols(); final int numVals = getNumValues(); @@ -260,7 +260,7 @@ public class ColGroupDDC1 extends ColGroupDDC throws DMLRuntimeException { double[] b = ConverterUtils.getDenseVector(vector); - double[] c = result.getDenseBlock(); + double[] c = result.getDenseBlockValues(); //prepare distinct values once double[][] vals = new double[grps.length][]; @@ -286,7 +286,7 @@ public class ColGroupDDC1 extends ColGroupDDC @Override public void leftMultByRowVector(MatrixBlock vector, MatrixBlock result) throws DMLRuntimeException { double[] a = ConverterUtils.getDenseVector(vector); - double[] c = result.getDenseBlock(); + double[] c = result.getDenseBlockValues(); final int nrow = getNumRows(); final int numVals = getNumValues(); @@ -303,7 +303,7 @@ public class ColGroupDDC1 extends ColGroupDDC @Override public void leftMultByRowVector(ColGroupDDC a, MatrixBlock result) throws DMLRuntimeException { - double[] c = result.getDenseBlock(); + double[] c = result.getDenseBlockValues(); final int nrow = getNumRows(); final int numVals = getNumValues(); @@ -342,7 +342,7 @@ public class ColGroupDDC1 extends ColGroupDDC protected void computeRowSums(MatrixBlock result, KahanFunction kplus, int rl, int ru) { KahanObject kbuff = new KahanObject(0, 0); KahanPlus kplus2 = KahanPlus.getKahanPlusFnObject(); - double[] c = result.getDenseBlock(); + double[] c = result.getDenseBlockValues(); //pre-aggregate nnz per value tuple double[] vals = sumAllValues(kplus, kbuff, false); @@ -362,7 +362,7 @@ public class ColGroupDDC1 extends ColGroupDDC { KahanObject kbuff = new KahanObject(0, 0); KahanPlus kplus2 = KahanPlus.getKahanPlusFnObject(); - double[] c = result.getDenseBlock(); + double[] c = result.getDenseBlockValues(); //prepare distinct values once double[][] vals = new double[grps.length][]; http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC2.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC2.java b/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC2.java index d9c851d..b046350 100644 --- a/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC2.java +++ b/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC2.java @@ -184,7 +184,7 @@ public class ColGroupDDC2 extends ColGroupDDC public void decompressToBlock(MatrixBlock target, int colpos) { int nrow = getNumRows(); int ncol = getNumCols(); - double[] c = target.getDenseBlock(); + double[] c = target.getDenseBlockValues(); int nnz = 0; for( int i = 0; i < nrow; i++ ) nnz += ((c[i] = _values[_data[i]*ncol+colpos])!=0) ? 1 : 0; @@ -224,7 +224,7 @@ public class ColGroupDDC2 extends ColGroupDDC @Override public void rightMultByVector(MatrixBlock vector, MatrixBlock result, int rl, int ru) throws DMLRuntimeException { double[] b = ConverterUtils.getDenseVector(vector); - double[] c = result.getDenseBlock(); + double[] c = result.getDenseBlockValues(); final int numCols = getNumCols(); final int numVals = getNumValues(); @@ -247,7 +247,7 @@ public class ColGroupDDC2 extends ColGroupDDC throws DMLRuntimeException { double[] a = ConverterUtils.getDenseVector(vector); - double[] c = result.getDenseBlock(); + double[] c = result.getDenseBlockValues(); final int nrow = getNumRows(); final int ncol = getNumCols(); final int numVals = getNumValues(); @@ -280,7 +280,7 @@ public class ColGroupDDC2 extends ColGroupDDC public void leftMultByRowVector(ColGroupDDC a, MatrixBlock result) throws DMLRuntimeException { - double[] c = result.getDenseBlock(); + double[] c = result.getDenseBlockValues(); final int nrow = getNumRows(); final int ncol = getNumCols(); final int numVals = getNumValues(); @@ -341,7 +341,7 @@ public class ColGroupDDC2 extends ColGroupDDC protected void computeRowSums(MatrixBlock result, KahanFunction kplus, int rl, int ru) { KahanObject kbuff = new KahanObject(0, 0); KahanPlus kplus2 = KahanPlus.getKahanPlusFnObject(); - double[] c = result.getDenseBlock(); + double[] c = result.getDenseBlockValues(); //pre-aggregate nnz per value tuple double[] vals = sumAllValues(kplus, kbuff, false); http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/compress/ColGroupOLE.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/compress/ColGroupOLE.java b/src/main/java/org/apache/sysml/runtime/compress/ColGroupOLE.java index 540739a..b655804 100644 --- a/src/main/java/org/apache/sysml/runtime/compress/ColGroupOLE.java +++ b/src/main/java/org/apache/sysml/runtime/compress/ColGroupOLE.java @@ -200,7 +200,7 @@ public class ColGroupOLE extends ColGroupOffset final int numCols = getNumCols(); final int numVals = getNumValues(); final int n = getNumRows(); - double[] c = target.getDenseBlock(); + double[] c = target.getDenseBlockValues(); //cache blocking config and position array int[] apos = allocIVector(numVals, true); @@ -298,7 +298,7 @@ public class ColGroupOLE extends ColGroupOffset throws DMLRuntimeException { double[] b = ConverterUtils.getDenseVector(vector); - double[] c = result.getDenseBlock(); + double[] c = result.getDenseBlockValues(); final int blksz = BitmapEncoder.BITMAP_BLOCK_SZ; final int numCols = getNumCols(); final int numVals = getNumValues(); @@ -388,7 +388,7 @@ public class ColGroupOLE extends ColGroupOffset throws DMLRuntimeException { double[] a = ConverterUtils.getDenseVector(vector); - double[] c = result.getDenseBlock(); + double[] c = result.getDenseBlockValues(); final int blksz = BitmapEncoder.BITMAP_BLOCK_SZ; final int numCols = getNumCols(); final int numVals = getNumValues(); @@ -462,7 +462,7 @@ public class ColGroupOLE extends ColGroupOffset throws DMLRuntimeException { //note: this method is only applicable for numrows < blocksize - double[] c = result.getDenseBlock(); + double[] c = result.getDenseBlockValues(); final int numCols = getNumCols(); final int numVals = getNumValues(); @@ -518,7 +518,7 @@ public class ColGroupOLE extends ColGroupOffset final int blksz = BitmapEncoder.BITMAP_BLOCK_SZ; final int numVals = getNumValues(); - double[] c = result.getDenseBlock(); + double[] c = result.getDenseBlockValues(); if( ALLOW_CACHE_CONSCIOUS_ROWSUMS && LOW_LEVEL_OPT && numVals > 1 && _numRows > blksz ) @@ -625,7 +625,7 @@ public class ColGroupOLE extends ColGroupOffset //NOTE: zeros handled once for all column groups outside final int blksz = BitmapEncoder.BITMAP_BLOCK_SZ; final int numVals = getNumValues(); - double[] c = result.getDenseBlock(); + double[] c = result.getDenseBlockValues(); //iterate over all values and their bitmaps for (int k = 0; k < numVals; k++) http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/compress/ColGroupRLE.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/compress/ColGroupRLE.java b/src/main/java/org/apache/sysml/runtime/compress/ColGroupRLE.java index 169ee4b..fdce4f5 100644 --- a/src/main/java/org/apache/sysml/runtime/compress/ColGroupRLE.java +++ b/src/main/java/org/apache/sysml/runtime/compress/ColGroupRLE.java @@ -191,7 +191,7 @@ public class ColGroupRLE extends ColGroupOffset final int numCols = getNumCols(); final int numVals = getNumValues(); final int n = getNumRows(); - double[] c = target.getDenseBlock(); + double[] c = target.getDenseBlockValues(); //position and start offset arrays int[] astart = new int[numVals]; @@ -269,7 +269,7 @@ public class ColGroupRLE extends ColGroupOffset throws DMLRuntimeException { double[] b = ConverterUtils.getDenseVector(vector); - double[] c = result.getDenseBlock(); + double[] c = result.getDenseBlockValues(); final int numCols = getNumCols(); final int numVals = getNumValues(); @@ -365,7 +365,7 @@ public class ColGroupRLE extends ColGroupOffset throws DMLRuntimeException { double[] a = ConverterUtils.getDenseVector(vector); - double[] c = result.getDenseBlock(); + double[] c = result.getDenseBlockValues(); final int numCols = getNumCols(); final int numVals = getNumValues(); final int n = getNumRows(); @@ -443,7 +443,7 @@ public class ColGroupRLE extends ColGroupOffset throws DMLRuntimeException { //note: this method is only applicable for numrows < blocksize - double[] c = result.getDenseBlock(); + double[] c = result.getDenseBlockValues(); final int numCols = getNumCols(); final int numVals = getNumValues(); @@ -538,7 +538,7 @@ public class ColGroupRLE extends ColGroupOffset KahanPlus kplus2 = KahanPlus.getKahanPlusFnObject(); final int numVals = getNumValues(); - double[] c = result.getDenseBlock(); + double[] c = result.getDenseBlockValues(); if( ALLOW_CACHE_CONSCIOUS_ROWSUMS && LOW_LEVEL_OPT && numVals > 1 @@ -651,7 +651,7 @@ public class ColGroupRLE extends ColGroupOffset { //NOTE: zeros handled once for all column groups outside final int numVals = getNumValues(); - double[] c = result.getDenseBlock(); + double[] c = result.getDenseBlockValues(); for (int k = 0; k < numVals; k++) { int boff = _ptr[k]; http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/compress/ColGroupUncompressed.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/compress/ColGroupUncompressed.java b/src/main/java/org/apache/sysml/runtime/compress/ColGroupUncompressed.java index c219ad6..b610adf 100644 --- a/src/main/java/org/apache/sysml/runtime/compress/ColGroupUncompressed.java +++ b/src/main/java/org/apache/sysml/runtime/compress/ColGroupUncompressed.java @@ -279,7 +279,7 @@ public class ColGroupUncompressed extends ColGroup MatrixBlock shortVector = new MatrixBlock(clen, 1, false); shortVector.allocateDenseBlock(); - double[] b = shortVector.getDenseBlock(); + double[] b = shortVector.getDenseBlockValues(); for (int colIx = 0; colIx < clen; colIx++) b[colIx] = vector.quickGetValue(_colIndexes[colIx], 0); shortVector.recomputeNonZeros(); @@ -296,7 +296,7 @@ public class ColGroupUncompressed extends ColGroup MatrixBlock shortVector = new MatrixBlock(clen, 1, false); shortVector.allocateDenseBlock(); - double[] b = shortVector.getDenseBlock(); + double[] b = shortVector.getDenseBlockValues(); for (int colIx = 0; colIx < clen; colIx++) b[colIx] = vector.quickGetValue(_colIndexes[colIx], 0); shortVector.recomputeNonZeros(); @@ -314,7 +314,7 @@ public class ColGroupUncompressed extends ColGroup // copying partialResult to the proper indices of the result if( !pret.isEmptyBlock(false) ) { - double[] rsltArr = result.getDenseBlock(); + double[] rsltArr = result.getDenseBlockValues(); for (int colIx = 0; colIx < _colIndexes.length; colIx++) rsltArr[_colIndexes[colIx]] = pret.quickGetValue(0, colIx); result.recomputeNonZeros(); @@ -329,7 +329,7 @@ public class ColGroupUncompressed extends ColGroup // copying partialResult to the proper indices of the result if( !pret.isEmptyBlock(false) ) { - double[] rsltArr = result.getDenseBlock(); + double[] rsltArr = result.getDenseBlockValues(); for (int colIx = 0; colIx < _colIndexes.length; colIx++) rsltArr[_colIndexes[colIx]] = pret.quickGetValue(0, colIx); result.recomputeNonZeros(); @@ -490,7 +490,7 @@ public class ColGroupUncompressed extends ColGroup } else { final int clen = getNumCols(); - double[] a = _data.getDenseBlock(); + double[] a = _data.getDenseBlockValues(); for(int j=0, aix=rowIx*clen; j<clen; j++) buff[_colIndexes[j]] = a[aix+j]; } http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/compress/CompressedMatrixBlock.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/compress/CompressedMatrixBlock.java b/src/main/java/org/apache/sysml/runtime/compress/CompressedMatrixBlock.java index e1a6a7b..81cc9cf 100644 --- a/src/main/java/org/apache/sysml/runtime/compress/CompressedMatrixBlock.java +++ b/src/main/java/org/apache/sysml/runtime/compress/CompressedMatrixBlock.java @@ -1188,7 +1188,7 @@ public class CompressedMatrixBlock extends MatrixBlock implements Externalizable //special handling init value for rowmins/rowmax if( op.indexFn instanceof ReduceCol && op.aggOp.increOp.fn instanceof Builtin ) { double val = Double.MAX_VALUE * ((((Builtin)op.aggOp.increOp.fn).getBuiltinCode()==BuiltinCode.MAX)?-1:1); - Arrays.fill(ret.getDenseBlock(), val); + ret.getDenseBlock().set(val); } //core unary aggregate @@ -1820,7 +1820,8 @@ public class CompressedMatrixBlock extends MatrixBlock implements Externalizable _ret = new MatrixBlock(ret.getNumRows(), ret.getNumColumns(), false); _ret.allocateDenseBlock(); if( _op.aggOp.increOp.fn instanceof Builtin ) - System.arraycopy(ret.getDenseBlock(), 0, _ret.getDenseBlock(), 0, ret.getNumRows()*ret.getNumColumns()); + System.arraycopy(ret.getDenseBlockValues(), 0, + _ret.getDenseBlockValues(), 0, ret.getNumRows()*ret.getNumColumns()); } else { //colSums _ret = ret; @@ -2117,7 +2118,8 @@ public class CompressedMatrixBlock extends MatrixBlock implements Externalizable ColGroupValue grpVal = (ColGroupValue)grp; MatrixBlock vals = grpVal.getValuesAsBlock(); int[] counts = grpVal.getCounts(true); - SortUtils.sortByValue(0, vals.getNumRows(), vals.getDenseBlock(), counts); + double[] data = (vals.getDenseBlock()!=null) ? vals.getDenseBlockValues() : null; + SortUtils.sortByValue(0, vals.getNumRows(), data, counts); MatrixBlock counts2 = ColGroupValue.getCountsAsBlock(counts); return vals.sortOperations(counts2, result); } http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/compress/utils/LinearAlgebraUtils.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/compress/utils/LinearAlgebraUtils.java b/src/main/java/org/apache/sysml/runtime/compress/utils/LinearAlgebraUtils.java index de6e233..981d944 100644 --- a/src/main/java/org/apache/sysml/runtime/compress/utils/LinearAlgebraUtils.java +++ b/src/main/java/org/apache/sysml/runtime/compress/utils/LinearAlgebraUtils.java @@ -145,7 +145,7 @@ public class LinearAlgebraUtils } public static void copyNonZerosToUpperTriangle( MatrixBlock ret, MatrixBlock tmp, int ix ) { - double[] a = tmp.getDenseBlock(); + double[] a = tmp.getDenseBlockValues(); for(int i=0; i<tmp.getNumColumns(); i++) { if( a[i] != 0 ) { ret.setValueDenseUnsafe( http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/controlprogram/ProgramBlock.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/controlprogram/ProgramBlock.java b/src/main/java/org/apache/sysml/runtime/controlprogram/ProgramBlock.java index 0996cd9..28256f6 100644 --- a/src/main/java/org/apache/sysml/runtime/controlprogram/ProgramBlock.java +++ b/src/main/java/org/apache/sysml/runtime/controlprogram/ProgramBlock.java @@ -255,7 +255,7 @@ public class ProgramBlock implements ParseInfo { // start time measurement for statistics long t0 = (DMLScript.STATISTICS || LOG.isTraceEnabled()) ? - System.nanoTime() : 0; + System.nanoTime() : 0; // pre-process instruction (debug state, inst patching, listeners) Instruction tmp = currInst.preprocessInstruction( ec ); http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/instructions/cp/ConvolutionCPInstruction.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/ConvolutionCPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/ConvolutionCPInstruction.java index 6be6459..08d220e 100644 --- a/src/main/java/org/apache/sysml/runtime/instructions/cp/ConvolutionCPInstruction.java +++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/ConvolutionCPInstruction.java @@ -310,7 +310,7 @@ public class ConvolutionCPInstruction extends UnaryCPInstruction { } else { outputBlock = new MatrixBlock(C, 1, false).allocateBlock(); - double [] output = outputBlock.getDenseBlock(); + double [] output = outputBlock.getDenseBlockValues(); if(input.isInSparseFormat()) { SparseBlock sblock = input.getSparseBlock(); for(int n = 0; n < input.getNumRows(); n++) { @@ -333,7 +333,7 @@ public class ConvolutionCPInstruction extends UnaryCPInstruction { } } else { - double [] inArr = input.getDenseBlock(); + double [] inArr = input.getDenseBlockValues(); if(inArr != null) { KahanPlus kplus = KahanPlus.getKahanPlusFnObject(); for(int c = 0; c < C; c++) { @@ -348,7 +348,7 @@ public class ConvolutionCPInstruction extends UnaryCPInstruction { } } } - outputBlock.recomputeNonZeros(getExtendedOpcode()); + outputBlock.recomputeNonZeros(); } // release inputs/outputs @@ -468,7 +468,8 @@ public class ConvolutionCPInstruction extends UnaryCPInstruction { // bias_add(empty mb, bias) outputBlock = new MatrixBlock(N, K*P*Q, false).allocateBlock(); for(int n = 0; n < params.N; n++) - ConvolutionUtils.fillBias(bias, outputBlock.getDenseBlock(), n, n+1, params.N, params.K, params.P*params.Q); + ConvolutionUtils.fillBias(bias, outputBlock.getDenseBlockValues(), + n, n+1, params.N, params.K, params.P*params.Q); } else { outputBlock = new MatrixBlock(N, K*P*Q, false).allocateBlock(); http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/instructions/cp/MatrixIndexingCPInstruction.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/MatrixIndexingCPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/MatrixIndexingCPInstruction.java index bee0434..4a636e1 100644 --- a/src/main/java/org/apache/sysml/runtime/instructions/cp/MatrixIndexingCPInstruction.java +++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/MatrixIndexingCPInstruction.java @@ -75,7 +75,7 @@ public final class MatrixIndexingCPInstruction extends IndexingCPInstruction { //ensure correct sparse/dense output representation if( checkGuardedRepresentationChange(matBlock, resultBlock) ) - resultBlock.examSparsity(getExtendedOpcode()); + resultBlock.examSparsity(); } //unpin output @@ -115,7 +115,7 @@ public final class MatrixIndexingCPInstruction extends IndexingCPInstruction { //ensure correct sparse/dense output representation //(memory guarded by release of input) - resultBlock.examSparsity(getExtendedOpcode()); + resultBlock.examSparsity(); //unpin output ec.setMatrixOutput(output.getName(), resultBlock, updateType, getExtendedOpcode()); http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/instructions/cp/MatrixMatrixBuiltinCPInstruction.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/MatrixMatrixBuiltinCPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/MatrixMatrixBuiltinCPInstruction.java index f247740..24af9b5 100644 --- a/src/main/java/org/apache/sysml/runtime/instructions/cp/MatrixMatrixBuiltinCPInstruction.java +++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/MatrixMatrixBuiltinCPInstruction.java @@ -39,14 +39,13 @@ public class MatrixMatrixBuiltinCPInstruction extends BuiltinBinaryCPInstruction throws DMLRuntimeException { String opcode = getOpcode(); - - if ( LibCommonsMath.isSupportedMatrixMatrixOperation(opcode) ) { - MatrixBlock solution = LibCommonsMath.matrixMatrixOperations(ec.getMatrixObject(input1.getName()), (MatrixObject)ec.getVariable(input2.getName()), opcode); - ec.setMatrixOutput(output.getName(), solution, getExtendedOpcode()); - return; - } + + if ( LibCommonsMath.isSupportedMatrixMatrixOperation(opcode) ) { + MatrixBlock solution = LibCommonsMath.matrixMatrixOperations(ec.getMatrixObject(input1.getName()), (MatrixObject)ec.getVariable(input2.getName()), opcode); + ec.setMatrixOutput(output.getName(), solution, getExtendedOpcode()); + return; + } - /* Default behavior of this instruction */ String output_name = output.getName(); BinaryOperator bop = (BinaryOperator) _optr; @@ -62,7 +61,7 @@ public class MatrixMatrixBuiltinCPInstruction extends BuiltinBinaryCPInstruction if( checkGuardedRepresentationChange(inBlock1, inBlock2, retBlock) ) { retBlock.examSparsity(); } - + ec.setMatrixOutput(output_name, retBlock, getExtendedOpcode()); } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/instructions/gpu/context/GPUObject.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/instructions/gpu/context/GPUObject.java b/src/main/java/org/apache/sysml/runtime/instructions/gpu/context/GPUObject.java index c4a16fc..22cdbcb 100644 --- a/src/main/java/org/apache/sysml/runtime/instructions/gpu/context/GPUObject.java +++ b/src/main/java/org/apache/sysml/runtime/instructions/gpu/context/GPUObject.java @@ -772,7 +772,7 @@ public class GPUObject { // Only recompute non-zero if unknown, else this will incur huge penalty !! if(tmp.getNonZeros() < 0) { - tmp.recomputeNonZeros(opcode); + tmp.recomputeNonZeros(); } long nnz = tmp.getNonZeros(); mat.getMatrixCharacteristics().setNonZeros(nnz); @@ -833,7 +833,7 @@ public class GPUObject { GPUStatistics.maintainCPMiscTimes(opcode, GPUInstruction.MISC_TIMER_HOST_TO_DEVICE, System.nanoTime() - t1); } } else { - double[] data = tmp.getDenseBlock(); + double[] data = tmp.getDenseBlockValues(); if (data == null && tmp.getSparseBlock() != null) throw new DMLRuntimeException("Incorrect sparsity calculation"); @@ -886,7 +886,8 @@ public class GPUObject { start = System.nanoTime(); MatrixBlock tmp = new MatrixBlock(toIntExact(mat.getNumRows()), toIntExact(mat.getNumColumns()), false); tmp.allocateDenseBlock(); - LibMatrixCUDA.cudaSupportFunctions.deviceToHost(getGPUContext(), getJcudaDenseMatrixPtr(), tmp.getDenseBlock(), instName, isEviction); + LibMatrixCUDA.cudaSupportFunctions.deviceToHost(getGPUContext(), + getJcudaDenseMatrixPtr(), tmp.getDenseBlockValues(), instName, isEviction); tmp.recomputeNonZeros(); mat.acquireModify(tmp); mat.release(); http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/instructions/mr/UaggOuterChainInstruction.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/instructions/mr/UaggOuterChainInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/mr/UaggOuterChainInstruction.java index c0c772c..3a378b6 100644 --- a/src/main/java/org/apache/sysml/runtime/instructions/mr/UaggOuterChainInstruction.java +++ b/src/main/java/org/apache/sysml/runtime/instructions/mr/UaggOuterChainInstruction.java @@ -165,8 +165,8 @@ public class UaggOuterChainInstruction extends BinaryInstruction implements IDis Arrays.sort(_bv); } } - - LibMatrixOuterAgg.resetOutputMatix(in1Ix, (MatrixBlock)in1Val, outIx, (MatrixBlock)outVal, _uaggOp); + + LibMatrixOuterAgg.resetOutputMatrix(in1Ix, (MatrixBlock)in1Val, outIx, (MatrixBlock)outVal, _uaggOp); LibMatrixOuterAgg.aggregateMatrix((MatrixBlock)in1Val, (MatrixBlock)outVal, _bv, _bvi, _bOp, _uaggOp); } else //default case http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/instructions/spark/ConvolutionSPInstruction.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/instructions/spark/ConvolutionSPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/spark/ConvolutionSPInstruction.java index 874371d..f812f86 100644 --- a/src/main/java/org/apache/sysml/runtime/instructions/spark/ConvolutionSPInstruction.java +++ b/src/main/java/org/apache/sysml/runtime/instructions/spark/ConvolutionSPInstruction.java @@ -19,7 +19,6 @@ package org.apache.sysml.runtime.instructions.spark; import java.util.ArrayList; -import java.util.Arrays; import java.util.Iterator; import org.apache.spark.api.java.JavaPairRDD; @@ -360,7 +359,7 @@ public class ConvolutionSPInstruction extends UnarySPInstruction { else { outputBlock = new MatrixBlock(params.N, params.C*params.P*params.Q, false).allocateBlock(); if(instOpcode.equalsIgnoreCase("maxpooling")) - Arrays.fill(outputBlock.getDenseBlock(), -Double.MAX_VALUE); + outputBlock.getDenseBlock().set(-Double.MAX_VALUE); LibMatrixDNN.maxpooling(matBlock, outputBlock, params); } } http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/instructions/spark/UaggOuterChainSPInstruction.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/instructions/spark/UaggOuterChainSPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/spark/UaggOuterChainSPInstruction.java index 9c7aefc..43c2106 100644 --- a/src/main/java/org/apache/sysml/runtime/instructions/spark/UaggOuterChainSPInstruction.java +++ b/src/main/java/org/apache/sysml/runtime/instructions/spark/UaggOuterChainSPInstruction.java @@ -124,9 +124,9 @@ public class UaggOuterChainSPInstruction extends BinarySPInstruction { JavaPairRDD<MatrixIndexes,MatrixBlock> in1 = sec.getBinaryBlockRDDHandleForVariable( rddVar ); MatrixCharacteristics mcIn = sec.getMatrixCharacteristics(rddVar); boolean noKeyChange = preservesPartitioning(mcIn, _uaggOp.indexFn); - + //execute UAggOuterChain instruction - JavaPairRDD<MatrixIndexes,MatrixBlock> out = null; + JavaPairRDD<MatrixIndexes,MatrixBlock> out = null; if (LibMatrixOuterAgg.isSupportedUaggOp(_uaggOp, _bOp)) { @@ -168,7 +168,7 @@ public class UaggOuterChainSPInstruction extends BinarySPInstruction { sec.setMatrixOutput(output.getName(), tmp, getExtendedOpcode()); } else //R/C AGG (output is rdd) - { + { //put output RDD handle into symbol table updateUnaryAggOutputMatrixCharacteristics(sec); @@ -250,7 +250,7 @@ public class UaggOuterChainSPInstruction extends BinarySPInstruction { public LazyIterableIterator<Tuple2<MatrixIndexes, MatrixBlock>> call(Iterator<Tuple2<MatrixIndexes, MatrixBlock>> arg0) throws Exception { - return new RDDMapUAggOuterChainIterator(arg0); + return new RDDMapUAggOuterChainIterator(arg0); } private class RDDMapUAggOuterChainIterator extends LazyIterableIterator<Tuple2<MatrixIndexes, MatrixBlock>> @@ -272,9 +272,9 @@ public class UaggOuterChainSPInstruction extends BinarySPInstruction { if((LibMatrixOuterAgg.isRowIndexMax(_uaggOp)) || (LibMatrixOuterAgg.isRowIndexMin(_uaggOp))) bvi = _bvi.getValue(); - LibMatrixOuterAgg.resetOutputMatix(in1Ix, in1Val, outIx, outVal, _uaggOp); + LibMatrixOuterAgg.resetOutputMatrix(in1Ix, in1Val, outIx, outVal, _uaggOp); LibMatrixOuterAgg.aggregateMatrix(in1Val, outVal, _bv.value(), bvi, _bOp, _uaggOp); - + return new Tuple2<>(outIx, outVal); } } http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/instructions/spark/utils/RDDConverterUtils.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/instructions/spark/utils/RDDConverterUtils.java b/src/main/java/org/apache/sysml/runtime/instructions/spark/utils/RDDConverterUtils.java index b5ce814..53e42ac 100644 --- a/src/main/java/org/apache/sysml/runtime/instructions/spark/utils/RDDConverterUtils.java +++ b/src/main/java/org/apache/sysml/runtime/instructions/spark/utils/RDDConverterUtils.java @@ -422,7 +422,7 @@ public class RDDConverterUtils return Vectors.sparse(row.getNumColumns(), row.getSparseBlock().indexes(0), row.getSparseBlock().values(0)); else // DENSE ROW - return Vectors.dense(row.getDenseBlock()); + return Vectors.dense(row.getDenseBlockValues()); } ///////////////////////////////// http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/instructions/spark/utils/RDDConverterUtilsExt.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/instructions/spark/utils/RDDConverterUtilsExt.java b/src/main/java/org/apache/sysml/runtime/instructions/spark/utils/RDDConverterUtilsExt.java index 951877e..eddc971 100644 --- a/src/main/java/org/apache/sysml/runtime/instructions/spark/utils/RDDConverterUtilsExt.java +++ b/src/main/java/org/apache/sysml/runtime/instructions/spark/utils/RDDConverterUtilsExt.java @@ -231,7 +231,7 @@ public class RDDConverterUtilsExt throw new DMLRuntimeException("MatrixBlock of size " + limit + " cannot be converted to dense numpy array"); ret = new byte[(int) (limit * times)]; - double [] denseBlock = mb.getDenseBlock(); + double [] denseBlock = mb.getDenseBlockValues(); if(mb.isEmptyBlock()) { for(int i=0;i < limit;i++){ ByteBuffer.wrap(ret, i*times, times).order(ByteOrder.nativeOrder()).putDouble(0); http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/io/ReaderTextCellParallel.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/io/ReaderTextCellParallel.java b/src/main/java/org/apache/sysml/runtime/io/ReaderTextCellParallel.java index 2afbd7e..6f4fa25 100644 --- a/src/main/java/org/apache/sysml/runtime/io/ReaderTextCellParallel.java +++ b/src/main/java/org/apache/sysml/runtime/io/ReaderTextCellParallel.java @@ -97,9 +97,9 @@ public class ReaderTextCellParallel extends MatrixReader //finally check if change of sparse/dense block representation required if( !AGGREGATE_BLOCK_NNZ ) - ret.recomputeNonZeros(); + ret.recomputeNonZeros(); ret.examSparsity(); - + return ret; } http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/io/WriterTextCell.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/io/WriterTextCell.java b/src/main/java/org/apache/sysml/runtime/io/WriterTextCell.java index 04dfd5a..b0636a3 100644 --- a/src/main/java/org/apache/sysml/runtime/io/WriterTextCell.java +++ b/src/main/java/org/apache/sysml/runtime/io/WriterTextCell.java @@ -91,7 +91,7 @@ public class WriterTextCell extends MatrixWriter StringBuilder sb = new StringBuilder(); if( sparse ) //SPARSE - { + { Iterator<IJV> iter = src.getSparseBlockIterator(rl, ru); while( iter.hasNext() ) { @@ -111,7 +111,7 @@ public class WriterTextCell extends MatrixWriter { for( int i=rl; i<ru; i++ ) { - String rowIndex = Integer.toString(i+1); + String rowIndex = Integer.toString(i+1); for( int j=0; j<clen; j++ ) { double lvalue = src.getValueDenseUnsafe(i, j); http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/matrix/data/BinaryBlockToBinaryCellConverter.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/BinaryBlockToBinaryCellConverter.java b/src/main/java/org/apache/sysml/runtime/matrix/data/BinaryBlockToBinaryCellConverter.java index 9c5d0d2..b7cc74e 100644 --- a/src/main/java/org/apache/sysml/runtime/matrix/data/BinaryBlockToBinaryCellConverter.java +++ b/src/main/java/org/apache/sysml/runtime/matrix/data/BinaryBlockToBinaryCellConverter.java @@ -69,7 +69,7 @@ Converter<MatrixIndexes, MatrixBlock, MatrixIndexes, MatrixCell> { if(v1.getDenseBlock()==null) return; - denseArray=v1.getDenseBlock(); + denseArray=v1.getDenseBlockValues(); nextInDenseArray=0; denseArraySize=v1.getNumRows()*v1.getNumColumns(); } http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/matrix/data/BinaryBlockToTextCellConverter.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/BinaryBlockToTextCellConverter.java b/src/main/java/org/apache/sysml/runtime/matrix/data/BinaryBlockToTextCellConverter.java index 98396d2..39ae854 100644 --- a/src/main/java/org/apache/sysml/runtime/matrix/data/BinaryBlockToTextCellConverter.java +++ b/src/main/java/org/apache/sysml/runtime/matrix/data/BinaryBlockToTextCellConverter.java @@ -74,7 +74,7 @@ Converter<MatrixIndexes, MatrixBlock, NullWritable, Text> { if(v1.getDenseBlock()==null) return; - denseArray=v1.getDenseBlock(); + denseArray=v1.getDenseBlockValues(); nextInDenseArray=0; denseArraySize=v1.getNumRows()*v1.getNumColumns(); } http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlock.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlock.java b/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlock.java index d498b79..3d82969 100644 --- a/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlock.java +++ b/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlock.java @@ -56,6 +56,16 @@ public abstract class DenseBlock implements Serializable public abstract void reset(int rlen, int clen); /** + * Resets the dense block by setting the given value. + * + * @param rlen number of rows + * @param clen number of columns + * @param v value + */ + public abstract void reset(int rlen, int clen, double v); + + + /** * Get the number of rows. * * @return number of rows @@ -93,6 +103,19 @@ public abstract class DenseBlock implements Serializable public abstract long countNonZeros(); /** + * Compute the number of non-zero values, which potentially + * makes a full pass over the underlying blocks. + * + * @param rl row lower index + * @param ru row upper index (exclusive) + * @param cl column lower index + * @param cu column upper index (exclusive) + * @return number of non-zeros + */ + public abstract long countNonZeros(int rl, int ru, int cl, int cu); + + + /** * Get the allocated blocks. * * @return blocks @@ -136,6 +159,26 @@ public abstract class DenseBlock implements Serializable public abstract int pos(int r, int c); /** + * Set the given value for the entire dense block (fill). + * + * @param v value + */ + public abstract void set(double v); + + /** + * Set the given value for an entire index range of the + * dense block (fill). + * + * @param rl row lower index + * @param ru row upper index (exclusive) + * @param cl column lower index + * @param cu column upper index (exclusive) + * @param v value + */ + public abstract void set(int rl, int ru, int cl, int cu, double v); + + + /** * Set the given value for a given row and column. * * @param r row index @@ -145,6 +188,14 @@ public abstract class DenseBlock implements Serializable public abstract void set(int r, int c, double v); /** + * Copy the given vector into the given row. + * + * @param r row index + * @param v value vector + */ + public abstract void set(int r, double[] v); + + /** * Get the value for a given row and column. * * @param r row index @@ -152,4 +203,7 @@ public abstract class DenseBlock implements Serializable * @return value */ public abstract double get(int r, int c); + + @Override + public abstract String toString(); } http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlockDRB.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlockDRB.java b/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlockDRB.java index 6f2b11d..e0d9443 100644 --- a/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlockDRB.java +++ b/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlockDRB.java @@ -31,21 +31,36 @@ public class DenseBlockDRB extends DenseBlock private int clen; public DenseBlockDRB(int rlen, int clen) { - reset(rlen, clen); + reset(rlen, clen, 0); } - + + public DenseBlockDRB(double[] data, int rlen, int clen) { + this.data = data; + this.rlen = rlen; + this.clen = clen; + } + @Override public void reset() { - reset(rlen, clen); + reset(rlen, clen, 0); } @Override public void reset(int rlen, int clen) { + reset(rlen, clen, 0); + } + + @Override + public void reset(int rlen, int clen, double v) { int len = rlen * clen; - if( len < capacity() ) - Arrays.fill(data, 0, len, 0); - else + if( len > capacity() ) { data = new double[len]; + if( v != 0 ) + Arrays.fill(data, v); + } + else { + Arrays.fill(data, 0, len, v); + } this.rlen = rlen; this.clen = clen; } @@ -73,9 +88,25 @@ public class DenseBlockDRB extends DenseBlock @Override public long countNonZeros() { final int len = rlen * clen; + double[] a = data; int nnz = 0; for(int i=0; i<len; i++) - nnz += (data[i]!=0) ? 1 : 0; + nnz += (a[i]!=0) ? 1 : 0; + return nnz; + } + + @Override + public long countNonZeros(int rl, int ru, int cl, int cu) { + long nnz = 0; + if( cl==0 && cu==clen ) { //specific case: all cols + for( int i=rl*clen; i<ru*clen; i++ ) + nnz += (data[i]!=0) ? 1 : 0; + } + else { + for( int i=rl, ix=rl*clen; i<ru; i++, ix+=clen ) + for( int j=cl; j<cu; j++ ) + nnz += (data[ix+j]!=0) ? 1 : 0; + } return nnz; } @@ -105,12 +136,41 @@ public class DenseBlockDRB extends DenseBlock } @Override + public void set(double v) { + Arrays.fill(data, 0, rlen*clen, v); + } + + @Override + public void set(int rl, int ru, int cl, int cu, double v) { + for(int i=rl, ix=rl*clen; i<ru; i++, ix+=clen) + Arrays.fill(data, ix+cl, ix+cu, v); + } + + @Override public void set(int r, int c, double v) { data[pos(r, c)] = v; } @Override + public void set(int r, double[] v) { + System.arraycopy(v, 0, data, pos(r), clen); + } + + @Override public double get(int r, int c) { return data[pos(r, c)]; } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + for(int i=0, ix=0; i<rlen; i++, ix+=clen) { + for(int j=0; j<clen; j++) { + sb.append(data[ix+j]); + sb.append("\t"); + } + sb.append("\n"); + } + return sb.toString(); + } } http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlockFactory.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlockFactory.java b/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlockFactory.java index 695b0af..b37e44d 100644 --- a/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlockFactory.java +++ b/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlockFactory.java @@ -28,6 +28,10 @@ public abstract class DenseBlockFactory return createDenseBlock(type, rlen, clen); } + public static DenseBlock createDenseBlock(double[] data, int rlen, int clen) { + return new DenseBlockDRB(data, rlen, clen); + } + public static DenseBlock createDenseBlock(DenseBlock.Type type, int rlen, int clen) { switch( type ) { case DRB: return new DenseBlockDRB(rlen, clen); http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlockLDRB.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlockLDRB.java b/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlockLDRB.java index aeaad9a..c6ded3a 100644 --- a/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlockLDRB.java +++ b/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlockLDRB.java @@ -36,26 +36,31 @@ public class DenseBlockLDRB extends DenseBlock } public DenseBlockLDRB(int rlen, int clen, int blen) { - reset(rlen, clen, blen); + reset(rlen, clen, blen, 0); } @Override public void reset() { - reset(rlen, clen, blen); + reset(rlen, clen, blen, 0); } @Override public void reset(int rlen, int clen) { - reset(rlen, clen, blen); + reset(rlen, clen, blen, 0); } - private void reset(int rlen, int clen, int blen) { + @Override + public void reset(int rlen, int clen, double v) { + reset(rlen, clen, blen, v); + } + + private void reset(int rlen, int clen, int blen, double v) { long llen = (long) rlen * clen; int numPart = (int)Math.ceil((double)rlen / blen); if( this.blen == blen && llen < capacity() ) { for(int i=0; i<numPart; i++) { int len = Math.min((i+1)*blen,rlen)-i*blen; - Arrays.fill(data[i], 0, len, 0); + Arrays.fill(data[i], 0, len, v); } } else { @@ -63,9 +68,10 @@ public class DenseBlockLDRB extends DenseBlock for(int i=0; i<numPart; i++) { int len = Math.min((i+1)*blen,rlen)-i*blen; data[i] = new double[len]; + if( v != 0 ) + Arrays.fill(data[i], v); } } - this.rlen = rlen; this.clen = clen; this.blen = blen; @@ -104,6 +110,18 @@ public class DenseBlockLDRB extends DenseBlock } return nnz; } + + @Override + public long countNonZeros(int rl, int ru, int cl, int cu) { + long nnz = 0; + for(int bi=index(rl); bi<index(ru); bi++) { + double[] a = data[bi]; + for(int i=pos(bi), ix=pos(bi)*clen; i<blen(bi); i++, ix+=clen) + for( int j=cl; j<cu; j++ ) + nnz += (a[ix+j]!=0) ? 1 : 0; + } + return nnz; + } @Override public double[][] values() { @@ -131,14 +149,54 @@ public class DenseBlockLDRB extends DenseBlock } @Override + public void set(double v) { + for(int i=0; i<numBlocks(); i++) + Arrays.fill(data[i], v); + } + + @Override + public void set(int rl, int ru, int cl, int cu, double v) { + for(int bi=index(rl); bi<=index(ru); bi++) { + int imin = pos(bi); + int imax = Math.min(ru, (bi+1)*blen)-bi; + for(int i=imin, ix=imin*clen; i<imax; i++, ix+=clen) + Arrays.fill(data, ix+cl, ix+cu, v); + } + } + + @Override public void set(int r, int c, double v) { data[index(r)][pos(r, c)] = v; } @Override + public void set(int r, double[] v) { + System.arraycopy(v, 0, data[index(r)], pos(r), v.length); + } + + @Override public double get(int r, int c) { return data[index(r)][pos(r, c)]; } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + for(int i=0; i<rlen; i++) { + double[] data = values(index(i)); + int ix = pos(i); + for(int j=0; j<clen; j++) { + sb.append(data[ix+j]); + sb.append("\t"); + } + sb.append("\n"); + } + return sb.toString(); + } + + private int blen(int bix) { + return Math.min(blen, rlen-bix*blen); + } private static int blocksize(int rlen, int clen) { return Math.min(rlen, Integer.MAX_VALUE / clen); http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/matrix/data/LibCommonsMath.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/LibCommonsMath.java b/src/main/java/org/apache/sysml/runtime/matrix/data/LibCommonsMath.java index d55499d..30aec56 100644 --- a/src/main/java/org/apache/sysml/runtime/matrix/data/LibCommonsMath.java +++ b/src/main/java/org/apache/sysml/runtime/matrix/data/LibCommonsMath.java @@ -63,7 +63,7 @@ public class LibCommonsMath if(opcode.equals("inverse")) return computeMatrixInverse(matrixInput); else if (opcode.equals("cholesky")) - return computeCholesky(matrixInput); + return computeCholesky(matrixInput); return null; } @@ -240,8 +240,8 @@ public class LibCommonsMath RealMatrix u = svd.getU(); RealMatrix v = svd.getV(); MatrixBlock U = DataConverter.convertToMatrixBlock(u.getData()); - MatrixBlock Sigma = DataConverter.convertToMatrixBlock(sigma, true); - Sigma = LibMatrixReorg.diag(Sigma, new MatrixBlock(Sigma.rlen, Sigma.rlen, true)); + MatrixBlock Sigma = DataConverter.convertToMatrixBlock(sigma, true); + Sigma = LibMatrixReorg.diag(Sigma, new MatrixBlock(Sigma.rlen, Sigma.rlen, true)); MatrixBlock V = DataConverter.convertToMatrixBlock(v.getData()); return new MatrixBlock[] { U, Sigma, V }; http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixAgg.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixAgg.java b/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixAgg.java index ae5e768..7e12de0 100644 --- a/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixAgg.java +++ b/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixAgg.java @@ -191,7 +191,7 @@ public class LibMatrixAgg if( in.isEmptyBlock(false) ){ aggregateUnaryMatrixEmpty(in, out, aggtype, uaop.indexFn); return; - } + } //Timing time = new Timing(true); @@ -203,7 +203,7 @@ public class LibMatrixAgg aggregateUnaryMatrixDense(in, out, aggtype, uaop.aggOp.increOp.fn, uaop.indexFn, 0, m); else aggregateUnaryMatrixSparse(in, out, aggtype, uaop.aggOp.increOp.fn, uaop.indexFn, 0, m); - + //cleanup output and change representation (if necessary) out.recomputeNonZeros(); out.examSparsity(); @@ -255,7 +255,7 @@ public class LibMatrixAgg new RowAggTask(in, out, aggtype, uaop, i*blklen, Math.min((i+1)*blklen, m)) : new PartialAggTask(in, out, aggtype, uaop, i*blklen, Math.min((i+1)*blklen, m)) ); } - pool.invokeAll(tasks); + pool.invokeAll(tasks); pool.shutdown(); //aggregate partial results if( !(uaop.indexFn instanceof ReduceCol) ) { @@ -557,7 +557,7 @@ public class LibMatrixAgg if( (type == AggType.MAX_INDEX || type == AggType.MIN_INDEX) && ix.getColumnIndex()!=1 ) //MAXINDEX or MININDEX { int m = out.rlen; - double[] c = out.getDenseBlock(); + double[] c = out.getDenseBlockValues(); for( int i=0, cix=0; i<m; i++, cix+=2 ) c[cix] = UtilFunctions.computeCellIndex(ix.getColumnIndex(), bclen, (int)c[cix]-1); } @@ -664,9 +664,9 @@ public class LibMatrixAgg KahanObject kbuff = new KahanObject(0, 0); KahanPlus kplus = KahanPlus.getKahanPlusFnObject(); - double[] a = in1.denseBlock; - double[] b1 = in2.denseBlock; - double[] b2 = (in3!=null) ? in3.denseBlock : null; //if null, literal 1 + double[] a = in1.getDenseBlockValues(); + double[] b1 = in2.getDenseBlockValues(); + double[] b2 = (in3!=null) ? in3.getDenseBlockValues() : null; //if null, literal 1 final int n = in1.clen; if( ixFn instanceof ReduceAll ) //tak+* @@ -682,7 +682,7 @@ public class LibMatrixAgg } else //tack+* { - double[] c = ret.getDenseBlock(); + double[] c = ret.getDenseBlockValues(); for( int i=rl, ix=rl*n; i<ru; i++ ) for( int j=0; j<n; j++, ix++ ) { double b2val = (b2 != null) ? b2[ix] : 1; @@ -734,7 +734,7 @@ public class LibMatrixAgg double val = val1 * val2; if( val != 0 && lin3 != null ) val *= lin3.quickGetValue(i, aix[j]); - kplus.execute2( kbuff, val ); + kplus.execute2( kbuff, val ); } } ret.quickSetValue(0, 0, kbuff._sum); @@ -742,7 +742,7 @@ public class LibMatrixAgg } else //tack+* { - double[] c = ret.getDenseBlock(); + double[] c = ret.getDenseBlockValues(); for( int i=rl; i<ru; i++ ) if( !a.isEmpty(i) ) { int apos = a.pos(i); @@ -825,8 +825,9 @@ public class LibMatrixAgg } else //DENSE target { + double[] a = target.getDenseBlockValues(); for ( int i=0; i < target.getNumColumns(); i++ ) { - double d = target.denseBlock[ i ]; + double d = a[ i ]; if( d != 0 ) //sparse-safe { int g = (int) groups.quickGetValue(i, 0); @@ -872,7 +873,7 @@ public class LibMatrixAgg } else //DENSE target { - double[] a = target.denseBlock; + double[] a = target.getDenseBlockValues(); for( int i=0, aix=0; i < groups.getNumRows(); i++, aix+=numCols ) { @@ -944,7 +945,7 @@ public class LibMatrixAgg } else //DENSE target { - double[] a = target.denseBlock; + double[] a = target.getDenseBlockValues(); for( int i=0, aix=0; i < groups.getNumRows(); i++, aix+=target.clen ) { @@ -977,7 +978,7 @@ public class LibMatrixAgg if( groups.isInSparseFormat() || groups.isEmptyBlock(false) ) throw new DMLRuntimeException("Unsupported sparse input for aggregate-count on group vector."); - double[] a = groups.denseBlock; + double[] a = groups.getDenseBlockValues(); int[] tmp = new int[numGroups]; int m = groups.rlen; @@ -1005,9 +1006,9 @@ public class LibMatrixAgg aggVal.allocateDenseBlock(); //should always stay in dense aggCorr.allocateDenseBlock(); //should always stay in dense - double[] a = in.getDenseBlock(); - double[] c = aggVal.getDenseBlock(); - double[] cc = aggCorr.getDenseBlock(); + double[] a = in.getDenseBlockValues(); + double[] c = aggVal.getDenseBlockValues(); + double[] cc = aggCorr.getDenseBlockValues(); KahanObject buffer1 = new KahanObject(0, 0); KahanPlus akplus = KahanPlus.getKahanPlusFnObject(); @@ -1043,8 +1044,8 @@ public class LibMatrixAgg aggCorr.allocateDenseBlock(); //should always stay in dense SparseBlock a = in.getSparseBlock(); - double[] c = aggVal.getDenseBlock(); - double[] cc = aggCorr.getDenseBlock(); + double[] c = aggVal.getDenseBlockValues(); + double[] cc = aggCorr.getDenseBlockValues(); KahanObject buffer1 = new KahanObject(0, 0); KahanPlus akplus = KahanPlus.getKahanPlusFnObject(); @@ -1127,7 +1128,7 @@ public class LibMatrixAgg final int m = in.rlen; final int n = in.clen; - double[] a = in.getDenseBlock(); + double[] a = in.getDenseBlockValues(); KahanObject buffer = new KahanObject(0, 0); KahanPlus akplus = KahanPlus.getKahanPlusFnObject(); @@ -1158,7 +1159,7 @@ public class LibMatrixAgg final int n = in.clen; final int cix = (m-1)*n; - double[] a = in.getDenseBlock(); + double[] a = in.getDenseBlockValues(); KahanObject buffer = new KahanObject(0, 0); KahanPlus akplus = KahanPlus.getKahanPlusFnObject(); @@ -1228,7 +1229,7 @@ public class LibMatrixAgg final int m = in.rlen; final int n = in.clen; - double[] a = in.getDenseBlock(); + double[] a = in.getDenseBlockValues(); KahanObject buffer = new KahanObject(0, 0); KahanPlus akplus = KahanPlus.getKahanPlusFnObject(); @@ -1296,8 +1297,8 @@ public class LibMatrixAgg final int m = in.rlen; final int n = in.clen; - double[] a = in.getDenseBlock(); - double[] c = out.getDenseBlock(); + double[] a = in.getDenseBlockValues(); + double[] c = out.getDenseBlockValues(); switch( optype ) { @@ -1419,7 +1420,7 @@ public class LibMatrixAgg final int n = in.clen; SparseBlock a = in.getSparseBlock(); - double[] c = out.getDenseBlock(); + double[] c = out.getDenseBlockValues(); switch( optype ) { @@ -1539,8 +1540,8 @@ public class LibMatrixAgg final int m = in.rlen; final int n = in.clen; - double[] a = in.getDenseBlock(); - double[] c = out.getDenseBlock(); + double[] a = in.getDenseBlockValues(); + double[] c = out.getDenseBlockValues(); switch( optype ) { @@ -1576,7 +1577,7 @@ public class LibMatrixAgg final int n = in.clen; SparseBlock a = in.getSparseBlock(); - double[] c = out.getDenseBlock(); + double[] c = out.getDenseBlockValues(); switch( optype ) {
