Using sparse matrix in CUDA kernel

Hi,
I’m trying to call nonzeros on a sparse matrix in my CUDA kernel but I’m getting a dynamic function invocation error: unsupported dynamic function invocation (call to nonzeros).

Is this simply not supported or am I missing something?

Here’s an example that should reproduce the error:

using CUDA
using SparseArrays

function kernel(sm)
    vals = nonzeros(sm)
    for val in vals
        @cuprintln("$val")
    end
    nothing
end

sm = cu(sprand(5, 5, 0.5))

@cuda kernel(sm)

Device-side functionality for sparse arrays is practically nonexisting. Many sparse array-related functions (like simply indexing) would require iteration, which is not something you want to do on each thread.

If you’re instead looking into actually implementing sparse array kernels, have a look at the implementation of broadcast for sparse arrays in the CUDA.jl source code, https://github.com/JuliaGPU/CUDA.jl/blob/master/lib/cusparse/broadcast.jl, but beware that this isn’t simple code. For simple element-wise operations like broadcast you can basically work on a thread per compressed row (or column) and use a for loop to iterate elements, which is what the linked code does through iteration helper structures to deduplicate code, but for more complex operations (like matmul) that isn’t viable.