Reputation: 109
I just wanted to know if there are any examples provided by Nvidia or any other trusted source that uses the csrmm
function from the cusparse
library, to multiply a sparse matrix with a dense matrix.
Thank you in advance
Upvotes: 4
Views: 4700
Reputation: 152143
Referring to the documentation, the csrmm
function is intended for multiplication of a sparse matrix times a dense matrix:
C=α∗op(A)∗B+β∗C
"where A is m×n sparse matrix ... B and C are dense matrices..."
If you would like to see an example usage, there is an example given in appendix B of the documentation:
/* exercise Level 3 routines (csrmm) */
cudaStat1 = cudaMalloc((void**)&z, 2*(n+1)*sizeof(z[0]));
if (cudaStat1 != cudaSuccess) {
CLEANUP("Device malloc failed (z)");
return 1;
}
cudaStat1 = cudaMemset((void *)z,0, 2*(n+1)*sizeof(z[0]));
if (cudaStat1 != cudaSuccess) {
CLEANUP("Memset on Device failed");
return 1;
}
status= cusparseDcsrmm(handle, CUSPARSE_OPERATION_NON_TRANSPOSE, n, 2, n,
nnz, &dfive, descr, cooVal, csrRowPtr, cooColIndex,
y, n, &dzero, z, n+1);
if (status != CUSPARSE_STATUS_SUCCESS) {
CLEANUP("Matrix-matrix multiplication failed");
return 1;
}
In this extract from the complete worked example given in appendix B, the sparse matrix A
is represented by descr
(matrix type descriptor), cooVal
(the non-zero values of A), csrRowPtr
(the CSR row pointers of A), and cooColIndex
(the COO column indices of A). y
is a pointer to the dense matrix corresponding to B
, and z
is a pointer to the dense matrix corresponding to C
in the general formula.
If you want to do dense times sparse, you may also be interested in @talonmies comment on this question:
It is a basic associative property of the matrix dot product that (Dense * Sparse).T == Sparse.T * Dense.T
Upvotes: 4