Repository: incubator-systemml Updated Branches: refs/heads/master 58a954609 -> afe7ebec0
[SYSTEMML-701] Fix sparse block conversion and cleanup gpu integration Project: http://git-wip-us.apache.org/repos/asf/incubator-systemml/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-systemml/commit/afe7ebec Tree: http://git-wip-us.apache.org/repos/asf/incubator-systemml/tree/afe7ebec Diff: http://git-wip-us.apache.org/repos/asf/incubator-systemml/diff/afe7ebec Branch: refs/heads/master Commit: afe7ebec0fac02bd409e02bebb6e3df9042fcbc1 Parents: 58a9546 Author: Matthias Boehm <[email protected]> Authored: Wed Aug 24 13:59:49 2016 +0200 Committer: Matthias Boehm <[email protected]> Committed: Wed Aug 24 13:59:49 2016 +0200 ---------------------------------------------------------------------- .../controlprogram/caching/MatrixObject.java | 10 --------- .../context/ExecutionContext.java | 2 +- .../gpu/AggregateBinaryGPUInstruction.java | 5 +++-- .../instructions/gpu/context/JCudaContext.java | 2 -- .../instructions/gpu/context/JCudaObject.java | 2 -- .../runtime/matrix/data/LibMatrixCUDA.java | 7 ------- .../sysml/runtime/matrix/data/MatrixBlock.java | 14 ++++++------- .../runtime/matrix/data/SparseBlockCSR.java | 22 ++++++++++---------- 8 files changed, 21 insertions(+), 43 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/afe7ebec/src/main/java/org/apache/sysml/runtime/controlprogram/caching/MatrixObject.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/controlprogram/caching/MatrixObject.java b/src/main/java/org/apache/sysml/runtime/controlprogram/caching/MatrixObject.java index fc5df81..b18b9ee 100644 --- a/src/main/java/org/apache/sysml/runtime/controlprogram/caching/MatrixObject.java +++ b/src/main/java/org/apache/sysml/runtime/controlprogram/caching/MatrixObject.java @@ -33,8 +33,6 @@ import org.apache.sysml.parser.Expression.ValueType; import org.apache.sysml.runtime.DMLRuntimeException; import org.apache.sysml.runtime.controlprogram.ParForProgramBlock.PDataPartitionFormat; import org.apache.sysml.runtime.controlprogram.context.SparkExecutionContext; -import org.apache.sysml.runtime.instructions.gpu.context.GPUContext; -import org.apache.sysml.runtime.instructions.gpu.context.GPUObject; import org.apache.sysml.runtime.instructions.spark.data.RDDObject; import org.apache.sysml.runtime.matrix.MatrixCharacteristics; import org.apache.sysml.runtime.matrix.MatrixDimensionsMetaData; @@ -662,12 +660,4 @@ public class MatrixObject extends CacheableData<MatrixBlock> long newnnz = SparkExecutionContext.writeRDDtoHDFS(rdd, fname, oinfo); ((MatrixDimensionsMetaData) _metaData).getMatrixCharacteristics().setNonZeros(newnnz); } - - /** - * Allocates the {@link GPUObject} which will be used - * to track the pointer on the GPU - */ - public void allocateGPUObject(){ - setGPUObject(GPUContext.createGPUObject(this)); - } } http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/afe7ebec/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContext.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContext.java b/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContext.java index 1ad1525..dd20fd0 100644 --- a/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContext.java +++ b/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContext.java @@ -294,7 +294,7 @@ public class ExecutionContext public MatrixObject allocateGPUMatrixObject(String varName) throws DMLRuntimeException { MatrixObject mo = getMatrixObject(varName); if( mo.getGPUObject() == null ) { - mo.allocateGPUObject(); + mo.setGPUObject(GPUContext.createGPUObject(mo)); } return mo; } http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/afe7ebec/src/main/java/org/apache/sysml/runtime/instructions/gpu/AggregateBinaryGPUInstruction.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/instructions/gpu/AggregateBinaryGPUInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/gpu/AggregateBinaryGPUInstruction.java index 5ed9b51..a668607 100644 --- a/src/main/java/org/apache/sysml/runtime/instructions/gpu/AggregateBinaryGPUInstruction.java +++ b/src/main/java/org/apache/sysml/runtime/instructions/gpu/AggregateBinaryGPUInstruction.java @@ -102,8 +102,7 @@ public class AggregateBinaryGPUInstruction extends GPUInstruction int clen = (int) (_isRightTransposed ? m2.getNumRows() : m2.getNumColumns()); ec.setMetaData(_output.getName(), rlen, clen); - //MatrixObject out = ec.getMatrixOutputForGPUInstruction(_output.getName(), false); - MatrixObject out = LibMatrixCUDA.matmult(ec, m1, m2, _output.getName(), _isLeftTransposed, _isRightTransposed); + LibMatrixCUDA.matmult(ec, m1, m2, _output.getName(), _isLeftTransposed, _isRightTransposed); //release inputs/outputs ec.releaseMatrixInputForGPUInstruction(_input1.getName()); @@ -117,6 +116,7 @@ public class AggregateBinaryGPUInstruction extends GPUInstruction * @return * @throws DMLRuntimeException */ + @SuppressWarnings("unused") private MatrixBlock transpose(MatrixBlock m1) throws DMLRuntimeException { ReorgOperator r_op = new ReorgOperator(SwapIndex.getSwapIndexFnObject(), 1); return (MatrixBlock) (m1.reorgOperations(r_op, new MatrixBlock(), 0, 0, 0)); @@ -129,6 +129,7 @@ public class AggregateBinaryGPUInstruction extends GPUInstruction * @return * @throws DMLRuntimeException */ + @SuppressWarnings("unused") private boolean isSparse(ExecutionContext ec, String var) throws DMLRuntimeException { MatrixObject mo = ec.getMatrixObject(var); return LibMatrixCUDA.isInSparseFormat(mo); http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/afe7ebec/src/main/java/org/apache/sysml/runtime/instructions/gpu/context/JCudaContext.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/instructions/gpu/context/JCudaContext.java b/src/main/java/org/apache/sysml/runtime/instructions/gpu/context/JCudaContext.java index 2ef00d4..bc16a05 100644 --- a/src/main/java/org/apache/sysml/runtime/instructions/gpu/context/JCudaContext.java +++ b/src/main/java/org/apache/sysml/runtime/instructions/gpu/context/JCudaContext.java @@ -29,7 +29,6 @@ import org.apache.sysml.utils.Statistics; import jcuda.driver.JCudaDriver; import jcuda.jcublas.JCublas2; import jcuda.jcublas.cublasHandle; -import jcuda.jcublas.cublasPointerMode; import jcuda.jcudnn.JCudnn; import jcuda.runtime.JCuda; import jcuda.jcudnn.cudnnHandle; @@ -38,7 +37,6 @@ import jcuda.jcusparse.cusparseHandle; import static jcuda.jcudnn.JCudnn.cudnnCreate; import static jcuda.jcublas.JCublas2.cublasCreate; -import static jcuda.jcublas.JCublas2.cublasSetPointerMode; import static jcuda.jcublas.JCublas2.cublasDestroy; import static jcuda.jcudnn.JCudnn.cudnnDestroy; import static jcuda.jcusparse.JCusparse.cusparseDestroy; http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/afe7ebec/src/main/java/org/apache/sysml/runtime/instructions/gpu/context/JCudaObject.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/instructions/gpu/context/JCudaObject.java b/src/main/java/org/apache/sysml/runtime/instructions/gpu/context/JCudaObject.java index 88ebf46..f7f3a73 100644 --- a/src/main/java/org/apache/sysml/runtime/instructions/gpu/context/JCudaObject.java +++ b/src/main/java/org/apache/sysml/runtime/instructions/gpu/context/JCudaObject.java @@ -47,9 +47,7 @@ import org.apache.sysml.utils.Statistics; import jcuda.Pointer; import jcuda.Sizeof; -import jcuda.jcublas.JCublas2; import jcuda.jcublas.cublasHandle; -import jcuda.jcublas.cublasOperation; import jcuda.jcusparse.JCusparse; import jcuda.jcusparse.cusparseDirection; import jcuda.jcusparse.cusparseHandle; http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/afe7ebec/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixCUDA.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixCUDA.java b/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixCUDA.java index 07cfa0c..af80bf6 100644 --- a/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixCUDA.java +++ b/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixCUDA.java @@ -45,18 +45,12 @@ import static jcuda.jcudnn.cudnnPoolingMode.CUDNN_POOLING_MAX; import static jcuda.jcudnn.cudnnTensorFormat.CUDNN_TENSOR_NCHW; import static jcuda.jcusparse.JCusparse.cusparseDcsrgemm; import static jcuda.jcusparse.JCusparse.cusparseDcsrmv; -import static jcuda.jcusparse.JCusparse.cusparseDdense2csr; -import static jcuda.jcusparse.JCusparse.cusparseDnnz; import static jcuda.jcusparse.cusparseOperation.CUSPARSE_OPERATION_NON_TRANSPOSE; import static jcuda.jcusparse.cusparseOperation.CUSPARSE_OPERATION_TRANSPOSE; import static jcuda.runtime.JCuda.cudaFree; import static jcuda.runtime.JCuda.cudaMalloc; -import static jcuda.jcusparse.cusparseOperation.CUSPARSE_OPERATION_NON_TRANSPOSE; -import static jcuda.jcusparse.cusparseOperation.CUSPARSE_OPERATION_TRANSPOSE; -import static jcuda.runtime.JCuda.cudaFree; import static jcuda.runtime.JCuda.cudaMemcpy; -import static jcuda.runtime.cudaMemcpyKind.cudaMemcpyDeviceToHost; import static jcuda.runtime.cudaMemcpyKind.cudaMemcpyHostToDevice; @@ -82,7 +76,6 @@ import jcuda.jcudnn.cudnnHandle; import jcuda.jcudnn.cudnnPoolingDescriptor; import jcuda.jcudnn.cudnnTensorDescriptor; import jcuda.jcusparse.cusparseHandle; -import java.util.Arrays; //FIXME move could to respective instructions, this is not a block library public class LibMatrixCUDA { http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/afe7ebec/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 9d233fc..da17207 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 @@ -95,9 +95,9 @@ public class MatrixBlock extends MatrixValue implements CacheBlock, Externalizab public static final double SPARSITY_TURN_POINT = 0.4; //sparsity threshold for ultra-sparse matrix operations (40nnz in a 1kx1k block) public static final double ULTRA_SPARSITY_TURN_POINT = 0.00004; - //default sparse block type: modified compressed sparse rows, CSR would best suited to use cuSparse + //default sparse block type: modified compressed sparse rows, for efficient incremental construction public static final SparseBlock.Type DEFAULT_SPARSEBLOCK = SparseBlock.Type.MCSR; - //default sparse block type for update in place: compressed sparse rows to prevent serialization + //default sparse block type for update in place: compressed sparse rows, to prevent serialization public static final SparseBlock.Type DEFAULT_INPLACE_SPARSEBLOCK = SparseBlock.Type.CSR; //basic header (int rlen, int clen, byte type) public static final int HEADER_SIZE = 9; @@ -160,12 +160,10 @@ public class MatrixBlock extends MatrixValue implements CacheBlock, Externalizab * @param nnz number of non zeroes * @param sparseBlock */ - public MatrixBlock(int rows, int cols, long nnz, SparseBlock sparseBlock) { - this.rlen = rows; - this.clen = cols; - this.nonZeros = nnz; - this.sparse = true; - this.sparseBlock = sparseBlock; + public MatrixBlock(int rl, int cl, long nnz, SparseBlock sblock) { + this(rl, cl, true, nnz); + nonZeros = nnz; + sparseBlock = sblock; } public MatrixBlock(MatrixBlock that, SparseBlock.Type stype, boolean deep) { http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/afe7ebec/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlockCSR.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlockCSR.java b/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlockCSR.java index ab4e665..04a6cb7 100644 --- a/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlockCSR.java +++ b/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlockCSR.java @@ -99,11 +99,9 @@ public class SparseBlockCSR extends SparseBlock int alen = sblock.size(i); int[] aix = sblock.indexes(i); double[] avals = sblock.values(i); - for( int j=apos; j<apos+alen; j++ ) { - _indexes[pos] = aix[j]; - _values[pos] = avals[j]; - pos++; - } + System.arraycopy(aix, apos, _indexes, pos, alen); + System.arraycopy(avals, apos, _values, pos, alen); + pos += alen; } _ptr[i+1]=pos; } @@ -125,12 +123,14 @@ public class SparseBlockCSR extends SparseBlock _size = nnz; for( int i=0, pos=0; i<rlen; i++ ) { - int alen = rows[i].size(); - int[] aix = rows[i].indexes(); - double[] avals = rows[i].values(); - System.arraycopy(aix, 0, _indexes, pos, alen); - System.arraycopy(avals, 0, _values, pos, alen); - pos += alen; + if( rows[i]!=null && !rows[i].isEmpty() ) { + int alen = rows[i].size(); + int[] aix = rows[i].indexes(); + double[] avals = rows[i].values(); + System.arraycopy(aix, 0, _indexes, pos, alen); + System.arraycopy(avals, 0, _values, pos, alen); + pos += alen; + } _ptr[i+1]=pos; } }
