LinearSolve.jl icon indicating copy to clipboard operation
LinearSolve.jl copied to clipboard

Passing a `CuSparseMatrixCOO` matrix to `LinearProblem` gives incorrect results

Open ma-sadeghi opened this issue 11 months ago • 5 comments

Here's an MWE:

using Statistics
using SparseArrays
using LinearSolve
using CUDA
using CUDA.CUSPARSE

n = 10
A_cpu = spdiagm(-1 => ones(n-1), 0 => -2*ones(n), 1 => ones(n-1))
colptr, rowval, nzval = A_cpu.colptr, A_cpu.rowval, A_cpu.nzval
b = zeros(n)
b[1] = -1.0
b_gpu = CuArray{Float32}(b)

A_csc = CuSparseMatrixCSC{Float32, Int32}(cu(colptr), cu(rowval), cu(nzval), size(A_cpu))

I, J, V = findnz(A_cpu)
A_coo = CuSparseMatrixCOO{Float32, Int32}(cu(I), cu(J), cu(V), size(A_cpu))

sol_csc_direct = solve(LinearProblem(A_cpu, b), UMFPACKFactorization())
sol_csc = solve(LinearProblem(A_csc, b_gpu), KrylovJL_CG(), maxiters=100)
sol_coo = solve(LinearProblem(A_coo, b_gpu), KrylovJL_CG(), maxiters=100)
sol_csc_from_coo = solve(LinearProblem(CuSparseMatrixCSC(A_coo), b_gpu), KrylovJL_CG(), maxiters=100)

println("CSC (direct): $(mean(sol_csc_direct.u))")
println("CSC (krylov): $(mean(sol_csc.u))")
println("COO (krylov): $(mean(sol_coo.u))")
println("CSC (from COO): $(mean(sol_csc_from_coo.u))")
CSC (direct): 0.4999999999999999	# correct
CSC (krylov): 0.5					# correct
COO (krylov): 0.05 					# incorrect
CSC (from COO): 0.5 				# correct

ma-sadeghi avatar Aug 02 '23 23:08 ma-sadeghi