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
-
-
Constructor Summary
Constructors Constructor Description GPUObject(GPUContext gCtx, MatrixObject mat, jcuda.Pointer ptr)
GPUObject(GPUContext gCtx, GPUObject that, MatrixObject mat)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description boolean
acquireDeviceModifyDense()
boolean
acquireDeviceModifyDense(boolean initialize)
boolean
acquireDeviceModifySparse()
boolean
acquireDeviceModifySparse(boolean initialize)
boolean
acquireDeviceRead(String opcode)
boolean
acquireHostRead(String instName)
if the data is allocated on the GPU and is dirty, it is copied back to the host memoryvoid
addReadLock()
void
addWriteLock()
void
allocateAndFillDense(double v)
Allocates a dense matrix of size obtained from the attached matrix metadata and fills it up with a single valuevoid
allocateSparseAndEmpty()
Allocates a sparse and emptyGPUObject
This is the result of operations that are both non zero matrices.void
clearData(String opcode, boolean eager)
Clears the data associated with thisGPUObject
instancevoid
clearDensePointer()
Removes the dense pointer and potential soft referencevoid
clearGPUObject()
Object
clone()
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.void
denseColumnMajorToRowMajor()
Convenience method.void
denseRowMajorToColumnMajor()
Convenience method.void
denseToSparse()
Converts this GPUObject from dense to sparse format.long
getAllocatedSize()
jcuda.Pointer
getDensePointer()
Pointer to dense matrixlong
getDensePointerAddress()
CSRPointer
getJcudaSparseMatrixPtr()
Pointer to sparse matrixMatrixObject
getMatrixObject()
long
getNnz(String instName, boolean recomputeDenseNNZ)
Being allocated is a prerequisite for computing nnz.static long
getPointerAddress(jcuda.Pointer p)
long
getSizeOnDevice()
CSRPointer
getSparseMatrixCudaPointer()
Convenience method to directly examine the Sparse matrix on GPUboolean
isAllocated()
boolean
isDensePointerNull()
Checks if the dense pointer is nullboolean
isDirty()
Whether this block is dirty on the GPUboolean
isLocked()
boolean
isSparse()
boolean
isSparseAndEmpty()
If thisGPUObject
is sparse and empty Being allocated is a prerequisite to being sparse and empty.void
releaseInput()
Releases input allocated on GPUvoid
releaseOutput()
releases output allocated on GPUvoid
releaseReadLock()
void
releaseWriteLock()
void
resetReadWriteLock()
void
setDensePointer(jcuda.Pointer densePtr)
Convenience method to directly set the dense matrix pointer on GPUvoid
setDirty(boolean flag)
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)void
sparseToColumnMajorDense()
More efficient method to convert sparse to dense but returns dense in column major formatvoid
sparseToDense()
Convert sparse to dense (Performs transpose, use sparseToColumnMajorDense if the kernel can deal with column major format)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.static int
toIntExact(long l)
String
toString()
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
-
-
-
Constructor Detail
-
GPUObject
public GPUObject(GPUContext gCtx, MatrixObject mat, jcuda.Pointer ptr)
-
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 validGPUContext
densePtr
- 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 validGPUContext
cusparseHandle
- 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 emptyGPUObject
This 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 thisGPUObject
is 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()
-
getAllocatedSize
public long getAllocatedSize()
-
toIntExact
public static int toIntExact(long l)
-
clearData
public void clearData(String opcode, boolean eager) throws DMLRuntimeException
Clears the data associated with thisGPUObject
instance- 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:
- ?
-
getDensePointerAddress
public long getDensePointerAddress()
-
getPointerAddress
public static long getPointerAddress(jcuda.Pointer p)
-
-