The Hiary
The Hiary

Reputation: 109

CuSparse csrmm example

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

Answers (1)

Robert Crovella
Robert Crovella

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

Related Questions