From 1909ff3d70c821c8fd19f53ada810e87cf37214c Mon Sep 17 00:00:00 2001 From: nHackel Date: Fri, 23 Jan 2026 16:21:18 +0100 Subject: [PATCH 1/5] Add direct sparse gpu constructors for COO, CSC, CSR and BSR --- lib/cusparse/array.jl | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/cusparse/array.jl b/lib/cusparse/array.jl index 98a898f111..03408a283d 100644 --- a/lib/cusparse/array.jl +++ b/lib/cusparse/array.jl @@ -53,6 +53,9 @@ mutable struct CuSparseMatrixCSC{Tv, Ti} <: GPUArrays.AbstractGPUSparseMatrixCSC new{Tv, Ti}(colPtr, rowVal, nzVal, dims, length(nzVal)) end end +function GPUSparseMatrixCSC(colPtr::CuVector{Ti, 1}, rowVal::CuVector{Ti, 1}, nzVal::CuVector{Tv, 1}, dims::NTuple{2,<:Integer}) where {Tv, Ti <: Integer} + return CuSparseMatrixCSC{Tv, Ti}(colPtr, rowVal, nzVal, dims) +end CuSparseMatrixCSC{Tv, Ti}(csc::CuSparseMatrixCSC{Tv, Ti}) where {Tv, Ti} = csc SparseArrays.rowvals(g::T) where {T<:CuSparseVector} = nonzeroinds(g) @@ -94,7 +97,9 @@ mutable struct CuSparseMatrixCSR{Tv, Ti} <: GPUArrays.AbstractGPUSparseMatrixCSR new{Tv, Ti}(rowPtr, colVal, nzVal, dims, length(nzVal)) end end - +function GPUSparseMatrixCSR(rowPtr::CuVector{Ti, 1}, colVal::CuVector{Ti, 1}, nzVal::CuVector{Tv, 1}, dims::NTuple{2,<:Integer}) where {Tv, Ti <: Integer} + return CuSparseMatrixCSR{Tv, Ti}(rowPtr, colVal, nzVal, dims) +end CuSparseMatrixCSR{Tv, Ti}(csr::CuSparseMatrixCSR{Tv, Ti}) where {Tv, Ti} = csr CuSparseMatrixCSR(A::CuSparseMatrixCSR) = A @@ -147,6 +152,9 @@ mutable struct CuSparseMatrixBSR{Tv, Ti} <: AbstractCuSparseMatrix{Tv, Ti} new{Tv, Ti}(rowPtr, colVal, nzVal, dims, blockDim, dir, nnz) end end +function GPUSparseMatrixBSR(rowPtr::CuVector{Ti, 1}, colVal::CuVector{Ti, 1}, nzVal::CuVector{Tv, 1}, dims::NTuple{2,<:Integer}, blockDim::Integer, args...) where {Tv, Ti <: Integer} + return CuSparseMatrixBSR{Tv, Ti}(rowPtr, colVal, nzVal, dims, blockDim, args...) +end CuSparseMatrixBSR(A::CuSparseMatrixBSR) = A @@ -177,7 +185,9 @@ mutable struct CuSparseMatrixCOO{Tv, Ti} <: AbstractCuSparseMatrix{Tv, Ti} new{Tv, Ti}(rowInd,colInd,nzVal,dims,nnz) end end - +function GPUSparseMatrixCOO(rowInd::CuVector{Ti, 1}, colInd::CuVector{Ti, 1}, nzVal::CuVector{Tv, 1}, dims::NTuple{2,<:Integer}) where {Tv, Ti <: Integer} + return CuSparseMatrixCOO{Tv, Ti}(rowInd, colInd, nzVal, dims) +end CuSparseMatrixCOO(A::CuSparseMatrixCOO) = A mutable struct CuSparseArrayCSR{Tv, Ti, N} <: GPUArrays.AbstractGPUSparseArray{Tv, Ti, N} From f9c2af801e0636fe2936860617943c9f32f29b4f Mon Sep 17 00:00:00 2001 From: nHackel Date: Fri, 23 Jan 2026 16:21:18 +0100 Subject: [PATCH 2/5] Add direct sparse gpu constructors for COO, CSC, CSR and BSR --- lib/cusparse/array.jl | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/cusparse/array.jl b/lib/cusparse/array.jl index 98a898f111..03408a283d 100644 --- a/lib/cusparse/array.jl +++ b/lib/cusparse/array.jl @@ -53,6 +53,9 @@ mutable struct CuSparseMatrixCSC{Tv, Ti} <: GPUArrays.AbstractGPUSparseMatrixCSC new{Tv, Ti}(colPtr, rowVal, nzVal, dims, length(nzVal)) end end +function GPUSparseMatrixCSC(colPtr::CuVector{Ti, 1}, rowVal::CuVector{Ti, 1}, nzVal::CuVector{Tv, 1}, dims::NTuple{2,<:Integer}) where {Tv, Ti <: Integer} + return CuSparseMatrixCSC{Tv, Ti}(colPtr, rowVal, nzVal, dims) +end CuSparseMatrixCSC{Tv, Ti}(csc::CuSparseMatrixCSC{Tv, Ti}) where {Tv, Ti} = csc SparseArrays.rowvals(g::T) where {T<:CuSparseVector} = nonzeroinds(g) @@ -94,7 +97,9 @@ mutable struct CuSparseMatrixCSR{Tv, Ti} <: GPUArrays.AbstractGPUSparseMatrixCSR new{Tv, Ti}(rowPtr, colVal, nzVal, dims, length(nzVal)) end end - +function GPUSparseMatrixCSR(rowPtr::CuVector{Ti, 1}, colVal::CuVector{Ti, 1}, nzVal::CuVector{Tv, 1}, dims::NTuple{2,<:Integer}) where {Tv, Ti <: Integer} + return CuSparseMatrixCSR{Tv, Ti}(rowPtr, colVal, nzVal, dims) +end CuSparseMatrixCSR{Tv, Ti}(csr::CuSparseMatrixCSR{Tv, Ti}) where {Tv, Ti} = csr CuSparseMatrixCSR(A::CuSparseMatrixCSR) = A @@ -147,6 +152,9 @@ mutable struct CuSparseMatrixBSR{Tv, Ti} <: AbstractCuSparseMatrix{Tv, Ti} new{Tv, Ti}(rowPtr, colVal, nzVal, dims, blockDim, dir, nnz) end end +function GPUSparseMatrixBSR(rowPtr::CuVector{Ti, 1}, colVal::CuVector{Ti, 1}, nzVal::CuVector{Tv, 1}, dims::NTuple{2,<:Integer}, blockDim::Integer, args...) where {Tv, Ti <: Integer} + return CuSparseMatrixBSR{Tv, Ti}(rowPtr, colVal, nzVal, dims, blockDim, args...) +end CuSparseMatrixBSR(A::CuSparseMatrixBSR) = A @@ -177,7 +185,9 @@ mutable struct CuSparseMatrixCOO{Tv, Ti} <: AbstractCuSparseMatrix{Tv, Ti} new{Tv, Ti}(rowInd,colInd,nzVal,dims,nnz) end end - +function GPUSparseMatrixCOO(rowInd::CuVector{Ti, 1}, colInd::CuVector{Ti, 1}, nzVal::CuVector{Tv, 1}, dims::NTuple{2,<:Integer}) where {Tv, Ti <: Integer} + return CuSparseMatrixCOO{Tv, Ti}(rowInd, colInd, nzVal, dims) +end CuSparseMatrixCOO(A::CuSparseMatrixCOO) = A mutable struct CuSparseArrayCSR{Tv, Ti, N} <: GPUArrays.AbstractGPUSparseArray{Tv, Ti, N} From a0968ab1f939e3f8e10ac957c1ac64e96a270c0a Mon Sep 17 00:00:00 2001 From: nHackel Date: Fri, 13 Mar 2026 15:11:04 +0100 Subject: [PATCH 3/5] Fix invalid array types GPUSparseMatrixX constructors --- lib/cusparse/array.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/cusparse/array.jl b/lib/cusparse/array.jl index 03408a283d..bb37a891db 100644 --- a/lib/cusparse/array.jl +++ b/lib/cusparse/array.jl @@ -53,7 +53,7 @@ mutable struct CuSparseMatrixCSC{Tv, Ti} <: GPUArrays.AbstractGPUSparseMatrixCSC new{Tv, Ti}(colPtr, rowVal, nzVal, dims, length(nzVal)) end end -function GPUSparseMatrixCSC(colPtr::CuVector{Ti, 1}, rowVal::CuVector{Ti, 1}, nzVal::CuVector{Tv, 1}, dims::NTuple{2,<:Integer}) where {Tv, Ti <: Integer} +function GPUArrays.GPUSparseMatrixCSC(colPtr::CuVector{Ti}, rowVal::CuVector{Ti}, nzVal::CuVector{Tv}, dims::NTuple{2,<:Integer}) where {Tv, Ti <: Integer} return CuSparseMatrixCSC{Tv, Ti}(colPtr, rowVal, nzVal, dims) end CuSparseMatrixCSC{Tv, Ti}(csc::CuSparseMatrixCSC{Tv, Ti}) where {Tv, Ti} = csc @@ -97,7 +97,7 @@ mutable struct CuSparseMatrixCSR{Tv, Ti} <: GPUArrays.AbstractGPUSparseMatrixCSR new{Tv, Ti}(rowPtr, colVal, nzVal, dims, length(nzVal)) end end -function GPUSparseMatrixCSR(rowPtr::CuVector{Ti, 1}, colVal::CuVector{Ti, 1}, nzVal::CuVector{Tv, 1}, dims::NTuple{2,<:Integer}) where {Tv, Ti <: Integer} +function GPUArrays.GPUSparseMatrixCSR(rowPtr::CuVector{Ti}, colVal::CuVector{Ti}, nzVal::CuVector{Tv}, dims::NTuple{2,<:Integer}) where {Tv, Ti <: Integer} return CuSparseMatrixCSR{Tv, Ti}(rowPtr, colVal, nzVal, dims) end CuSparseMatrixCSR{Tv, Ti}(csr::CuSparseMatrixCSR{Tv, Ti}) where {Tv, Ti} = csr From a6cfd9d689da80733b30d7e92a2ff09a78495929 Mon Sep 17 00:00:00 2001 From: nHackel Date: Fri, 13 Mar 2026 15:25:23 +0100 Subject: [PATCH 4/5] Fix invalid array types for GPUSparseMatrixCOO and BSR --- lib/cusparse/array.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/cusparse/array.jl b/lib/cusparse/array.jl index bb37a891db..0564a4b2f9 100644 --- a/lib/cusparse/array.jl +++ b/lib/cusparse/array.jl @@ -152,7 +152,7 @@ mutable struct CuSparseMatrixBSR{Tv, Ti} <: AbstractCuSparseMatrix{Tv, Ti} new{Tv, Ti}(rowPtr, colVal, nzVal, dims, blockDim, dir, nnz) end end -function GPUSparseMatrixBSR(rowPtr::CuVector{Ti, 1}, colVal::CuVector{Ti, 1}, nzVal::CuVector{Tv, 1}, dims::NTuple{2,<:Integer}, blockDim::Integer, args...) where {Tv, Ti <: Integer} +function GPUSparseArrays.GPUSparseMatrixBSR(rowPtr::CuVector{Ti}, colVal::CuVector{Ti}, nzVal::CuVector{Tv}, dims::NTuple{2,<:Integer}, blockDim::Integer, args...) where {Tv, Ti <: Integer} return CuSparseMatrixBSR{Tv, Ti}(rowPtr, colVal, nzVal, dims, blockDim, args...) end @@ -185,7 +185,7 @@ mutable struct CuSparseMatrixCOO{Tv, Ti} <: AbstractCuSparseMatrix{Tv, Ti} new{Tv, Ti}(rowInd,colInd,nzVal,dims,nnz) end end -function GPUSparseMatrixCOO(rowInd::CuVector{Ti, 1}, colInd::CuVector{Ti, 1}, nzVal::CuVector{Tv, 1}, dims::NTuple{2,<:Integer}) where {Tv, Ti <: Integer} +function GPUSparseArrays.GPUSparseMatrixCOO(rowInd::CuVector{Ti}, colInd::CuVector{Ti}, nzVal::CuVector{Tv}, dims::NTuple{2,<:Integer}) where {Tv, Ti <: Integer} return CuSparseMatrixCOO{Tv, Ti}(rowInd, colInd, nzVal, dims) end CuSparseMatrixCOO(A::CuSparseMatrixCOO) = A From 423fbb812c9414262d4b2f4dd3a802c3d67dfd21 Mon Sep 17 00:00:00 2001 From: nHackel Date: Fri, 13 Mar 2026 15:31:34 +0100 Subject: [PATCH 5/5] Fix incorrect module name --- lib/cusparse/array.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/cusparse/array.jl b/lib/cusparse/array.jl index 0564a4b2f9..9f74683bae 100644 --- a/lib/cusparse/array.jl +++ b/lib/cusparse/array.jl @@ -152,7 +152,7 @@ mutable struct CuSparseMatrixBSR{Tv, Ti} <: AbstractCuSparseMatrix{Tv, Ti} new{Tv, Ti}(rowPtr, colVal, nzVal, dims, blockDim, dir, nnz) end end -function GPUSparseArrays.GPUSparseMatrixBSR(rowPtr::CuVector{Ti}, colVal::CuVector{Ti}, nzVal::CuVector{Tv}, dims::NTuple{2,<:Integer}, blockDim::Integer, args...) where {Tv, Ti <: Integer} +function GPUArrays.GPUSparseMatrixBSR(rowPtr::CuVector{Ti}, colVal::CuVector{Ti}, nzVal::CuVector{Tv}, dims::NTuple{2,<:Integer}, blockDim::Integer, args...) where {Tv, Ti <: Integer} return CuSparseMatrixBSR{Tv, Ti}(rowPtr, colVal, nzVal, dims, blockDim, args...) end @@ -185,7 +185,7 @@ mutable struct CuSparseMatrixCOO{Tv, Ti} <: AbstractCuSparseMatrix{Tv, Ti} new{Tv, Ti}(rowInd,colInd,nzVal,dims,nnz) end end -function GPUSparseArrays.GPUSparseMatrixCOO(rowInd::CuVector{Ti}, colInd::CuVector{Ti}, nzVal::CuVector{Tv}, dims::NTuple{2,<:Integer}) where {Tv, Ti <: Integer} +function GPUArrays.GPUSparseMatrixCOO(rowInd::CuVector{Ti}, colInd::CuVector{Ti}, nzVal::CuVector{Tv}, dims::NTuple{2,<:Integer}) where {Tv, Ti <: Integer} return CuSparseMatrixCOO{Tv, Ti}(rowInd, colInd, nzVal, dims) end CuSparseMatrixCOO(A::CuSparseMatrixCOO) = A