Class GPUObject
- java.lang.Object
-
- org.apache.sysds.runtime.instructions.gpu.context.GPUObject
-
public class GPUObject extends Object
Handle to a matrix block on the GPU
-
-
Field Summary
Fields Modifier and Type Field Description GPUObjectlineageCachedChainHeadNext GPUObject that points to the same lineage cached GPU pointerGPUObjectnextLineageCachedEntryHead of the linked list of GPUObjects that point to the same lineage cached GPU pointer
-
Constructor Summary
Constructors Constructor Description GPUObject(GPUContext gCtx, GPUObject that, MatrixObject mat)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description booleanacquireDeviceModifyDense()booleanacquireDeviceModifyDense(boolean initialize)booleanacquireDeviceModifySparse()booleanacquireDeviceModifySparse(boolean initialize)booleanacquireDeviceRead(String opcode)booleanacquireHostRead(String instName)if the data is allocated on the GPU and is dirty, it is copied back to the host memoryvoidaddReadLock()voidaddWriteLock()voidallocateAndFillDense(double v)Allocates a dense matrix of size obtained from the attached matrix metadata and fills it up with a single valuevoidallocateSparseAndEmpty()Allocates a sparse and emptyGPUObjectThis is the result of operations that are both non zero matrices.voidclearData(String opcode, boolean eager)Clears the data associated with thisGPUObjectinstancevoidclearDensePointer()Removes the dense pointer and potential soft referencevoidclearGPUObject()Objectclone()static CSRPointercolumnMajorDenseToRowMajorSparse(GPUContext gCtx, jcuda.jcusparse.cusparseHandle cusparseHandle, jcuda.Pointer densePtr, int rows, int cols)Convenience method to convert a CSR matrix to a dense matrix on the GPU Since the allocated matrix is temporary, bookkeeping is not updated.voiddenseColumnMajorToRowMajor()Convenience method.voiddenseRowMajorToColumnMajor()Convenience method.voiddenseToSparse()Converts this GPUObject from dense to sparse format.MatrixBlockevictFromDeviceToHostMB(String instName, boolean eagerDelete)jcuda.PointergetDensePointer()Pointer to dense matrixlonggetDensePointerAddress()CSRPointergetJcudaSparseMatrixPtr()Pointer to sparse matrixMatrixObjectgetMatrixObject()longgetNnz(String instName, boolean recomputeDenseNNZ)Being allocated is a prerequisite for computing nnz.static longgetPointerAddress(jcuda.Pointer p)longgetSizeOnDevice()CSRPointergetSparseMatrixCudaPointer()Convenience method to directly examine the Sparse matrix on GPUbooleanisAllocated()booleanisDensePointerNull()Checks if the dense pointer is nullbooleanisDirty()Whether this block is dirty on the GPUbooleanisLinCached()booleanisLocked()booleanisrmVarPending()booleanisSparse()booleanisSparseAndEmpty()If thisGPUObjectis sparse and empty Being allocated is a prerequisite to being sparse and empty.voidreleaseInput()Releases input allocated on GPUvoidreleaseOutput()releases output allocated on GPUvoidreleaseReadLock()voidreleaseWriteLock()voidresetReadWriteLock()voidsetDensePointer(jcuda.Pointer densePtr)Convenience method to directly set the dense matrix pointer on GPUvoidsetDirty(boolean flag)voidsetIsLinCached(boolean val)voidsetrmVarPending(boolean val)voidsetSparseMatrixCudaPointer(CSRPointer sparseMatrixPtr)Convenience method to directly set the sparse matrix on GPU Needed for operations like cusparseDcsrgemm(cusparseHandle, int, int, int, int, int, cusparseMatDescr, int, Pointer, Pointer, Pointer, cusparseMatDescr, int, Pointer, Pointer, Pointer, cusparseMatDescr, Pointer, Pointer, Pointer)voidsparseToColumnMajorDense()More efficient method to convert sparse to dense but returns dense in column major formatvoidsparseToDense()Convert sparse to dense (Performs transpose, use sparseToColumnMajorDense if the kernel can deal with column major format)voidsparseToDense(String instructionName)Convert sparse to dense (Performs transpose, use sparseToColumnMajorDense if the kernel can deal with column major format) Also records per instruction invokation of sparseToDense.static inttoIntExact(long l)StringtoString()static jcuda.Pointertranspose(GPUContext gCtx, jcuda.Pointer densePtr, int m, int n, int lda, int ldc)Transposes a dense matrix on the GPU by calling the cublasDgeam operation
-
-
-
Constructor Detail
-
GPUObject
public GPUObject(GPUContext gCtx, GPUObject that, MatrixObject mat)
-
-
Method Detail
-
getDensePointer
public jcuda.Pointer getDensePointer()
Pointer to dense matrix- Returns:
- a pointer to the dense matrix
-
isDensePointerNull
public boolean isDensePointerNull()
Checks if the dense pointer is null- Returns:
- if the state of dense pointer is null
-
clearDensePointer
public void clearDensePointer()
Removes the dense pointer and potential soft reference
-
getMatrixObject
public MatrixObject getMatrixObject()
-
setDensePointer
public void setDensePointer(jcuda.Pointer densePtr)
Convenience method to directly set the dense matrix pointer on GPU- Parameters:
densePtr- dense pointer
-
setDirty
public void setDirty(boolean flag)
-
clone
public Object clone()
-
transpose
public static jcuda.Pointer transpose(GPUContext gCtx, jcuda.Pointer densePtr, int m, int n, int lda, int ldc)
Transposes a dense matrix on the GPU by calling the cublasDgeam operation- Parameters:
gCtx- a validGPUContextdensePtr- Pointer to dense matrix on the GPUm- rows in ouput matrixn- columns in output matrixlda- rows in input matrixldc- columns in output matrix- Returns:
- transposed matrix
-
columnMajorDenseToRowMajorSparse
public static CSRPointer columnMajorDenseToRowMajorSparse(GPUContext gCtx, jcuda.jcusparse.cusparseHandle cusparseHandle, jcuda.Pointer densePtr, int rows, int cols)
Convenience method to convert a CSR matrix to a dense matrix on the GPU Since the allocated matrix is temporary, bookkeeping is not updated. Also note that the input dense matrix is expected to be in COLUMN MAJOR FORMAT Caller is responsible for deallocating memory on GPU.- Parameters:
gCtx- a validGPUContextcusparseHandle- handle to cusparse librarydensePtr- [in] dense matrix pointer on the GPU in row majorrows- number of rowscols- number of columns- Returns:
- CSR (compressed sparse row) pointer
-
getSparseMatrixCudaPointer
public CSRPointer getSparseMatrixCudaPointer()
Convenience method to directly examine the Sparse matrix on GPU- Returns:
- CSR (compressed sparse row) pointer
-
setSparseMatrixCudaPointer
public void setSparseMatrixCudaPointer(CSRPointer sparseMatrixPtr)
Convenience method to directly set the sparse matrix on GPU Needed for operations like cusparseDcsrgemm(cusparseHandle, int, int, int, int, int, cusparseMatDescr, int, Pointer, Pointer, Pointer, cusparseMatDescr, int, Pointer, Pointer, Pointer, cusparseMatDescr, Pointer, Pointer, Pointer)- Parameters:
sparseMatrixPtr- CSR (compressed sparse row) pointer
-
denseToSparse
public void denseToSparse()
Converts this GPUObject from dense to sparse format.
-
denseRowMajorToColumnMajor
public void denseRowMajorToColumnMajor()
Convenience method. Converts Row Major Dense Matrix to Column Major Dense Matrix
-
denseColumnMajorToRowMajor
public void denseColumnMajorToRowMajor()
Convenience method. Converts Column Major Dense Matrix to Row Major Dense Matrix
-
sparseToDense
public void sparseToDense()
Convert sparse to dense (Performs transpose, use sparseToColumnMajorDense if the kernel can deal with column major format)
-
sparseToDense
public void sparseToDense(String instructionName)
Convert sparse to dense (Performs transpose, use sparseToColumnMajorDense if the kernel can deal with column major format) Also records per instruction invokation of sparseToDense.- Parameters:
instructionName- Name of the instruction for which statistics are recorded inGPUStatistics
-
sparseToColumnMajorDense
public void sparseToColumnMajorDense()
More efficient method to convert sparse to dense but returns dense in column major format
-
isSparse
public boolean isSparse()
-
isAllocated
public boolean isAllocated()
-
allocateSparseAndEmpty
public void allocateSparseAndEmpty()
Allocates a sparse and emptyGPUObjectThis is the result of operations that are both non zero matrices.
-
allocateAndFillDense
public void allocateAndFillDense(double v)
Allocates a dense matrix of size obtained from the attached matrix metadata and fills it up with a single value- Parameters:
v- value to fill up the dense matrix
-
isSparseAndEmpty
public boolean isSparseAndEmpty()
If thisGPUObjectis sparse and empty Being allocated is a prerequisite to being sparse and empty.- Returns:
- true if sparse and empty
-
getNnz
public long getNnz(String instName, boolean recomputeDenseNNZ)
Being allocated is a prerequisite for computing nnz. Note: if the matrix is in dense format, it explicitly re-computes the number of nonzeros.- Parameters:
instName- instruction namerecomputeDenseNNZ- recompute NNZ if dense- Returns:
- the number of nonzeroes
-
acquireDeviceRead
public boolean acquireDeviceRead(String opcode)
-
acquireDeviceModifyDense
public boolean acquireDeviceModifyDense()
-
acquireDeviceModifyDense
public boolean acquireDeviceModifyDense(boolean initialize)
-
acquireDeviceModifySparse
public boolean acquireDeviceModifySparse()
-
acquireDeviceModifySparse
public boolean acquireDeviceModifySparse(boolean initialize)
-
acquireHostRead
public boolean acquireHostRead(String instName)
if the data is allocated on the GPU and is dirty, it is copied back to the host memory- Parameters:
instName- name of the instruction- Returns:
- true if a copy to host happened, false otherwise
-
isLocked
public boolean isLocked()
-
addReadLock
public void addReadLock()
-
addWriteLock
public void addWriteLock()
-
releaseReadLock
public void releaseReadLock()
-
releaseWriteLock
public void releaseWriteLock()
-
resetReadWriteLock
public void resetReadWriteLock()
-
releaseInput
public void releaseInput()
Releases input allocated on GPU
-
releaseOutput
public void releaseOutput()
releases output allocated on GPU
-
getSizeOnDevice
public long getSizeOnDevice()
-
toIntExact
public static int toIntExact(long l)
-
evictFromDeviceToHostMB
public MatrixBlock evictFromDeviceToHostMB(String instName, boolean eagerDelete) throws DMLRuntimeException
- Throws:
DMLRuntimeException
-
clearData
public void clearData(String opcode, boolean eager) throws DMLRuntimeException
Clears the data associated with thisGPUObjectinstance- Parameters:
opcode- opcode of the instructioneager- whether to be done synchronously or asynchronously- Throws:
DMLRuntimeException- if error occurs
-
clearGPUObject
public void clearGPUObject()
-
getJcudaSparseMatrixPtr
public CSRPointer getJcudaSparseMatrixPtr()
Pointer to sparse matrix- Returns:
- ?
-
isDirty
public boolean isDirty()
Whether this block is dirty on the GPU- Returns:
- ?
-
setIsLinCached
public void setIsLinCached(boolean val)
-
isLinCached
public boolean isLinCached()
-
setrmVarPending
public void setrmVarPending(boolean val)
-
isrmVarPending
public boolean isrmVarPending()
-
getDensePointerAddress
public long getDensePointerAddress()
-
getPointerAddress
public static long getPointerAddress(jcuda.Pointer p)
-
-