@@ -9,7 +9,7 @@ export CuSparseMatrixCSC, CuSparseMatrixCSR, CuSparseMatrixBSR, CuSparseMatrixCO
99
1010using LinearAlgebra: BlasFloat
1111using SparseArrays
12- using SparseArrays: nonzeroinds, nonzeros, rowvals, getcolptr
12+ using SparseArrays: nonzeroinds, nonzeros, rowvals, getcolptr, dimlub
1313abstract type AbstractCuSparseVector{Tv, Ti} <: GPUArrays.AbstractGPUSparseArray{Tv, Ti, 1} end
1414abstract type AbstractCuSparseMatrix{Tv, Ti} <: GPUArrays.AbstractGPUSparseArray{Tv, Ti, 2} end
1515
@@ -43,6 +43,7 @@ mutable struct CuSparseMatrixCSC{Tv, Ti} <: GPUArrays.AbstractGPUSparseMatrixCSC
4343 new {Tv, Ti} (colPtr, rowVal, nzVal, dims, length (nzVal))
4444 end
4545end
46+ CuSparseMatrixCSC {Tv, Ti} (csc:: CuSparseMatrixCSC{Tv, Ti} ) where {Tv, Ti} = csc
4647
4748SparseArrays. rowvals (g:: T ) where {T<: CuSparseVector } = nonzeroinds (g)
4849
@@ -84,6 +85,7 @@ mutable struct CuSparseMatrixCSR{Tv, Ti} <: GPUArrays.AbstractGPUSparseMatrixCSR
8485 end
8586end
8687
88+ CuSparseMatrixCSR {Tv, Ti} (csr:: CuSparseMatrixCSR{Tv, Ti} ) where {Tv, Ti} = csr
8789CuSparseMatrixCSR (A:: CuSparseMatrixCSR ) = A
8890
8991function CUDA. unsafe_free! (xs:: CuSparseMatrixCSR )
@@ -108,6 +110,10 @@ GPUArrays._dense_array_type(::Type{<:CuSparseMatrixCSR}) = CuArray
108110
109111GPUArrays. _csc_type (sa:: CuSparseMatrixCSR ) = CuSparseMatrixCSC
110112GPUArrays. _csr_type (sa:: CuSparseMatrixCSC ) = CuSparseMatrixCSR
113+ GPUArrays. _coo_type (sa:: Union{CuSparseMatrixCSR, Transpose{<:Any,<:CuSparseMatrixCSR}, Adjoint{<:Any,<:CuSparseMatrixCSR}} ) = CuSparseMatrixCOO
114+ GPUArrays. _coo_type (sa:: Union{CuSparseMatrixCSC, Transpose{<:Any,<:CuSparseMatrixCSC}, Adjoint{<:Any,<:CuSparseMatrixCSC}} ) = CuSparseMatrixCOO
115+ GPUArrays. _coo_type (:: Type{T} ) where {T<: Union{CuSparseMatrixCSR, Transpose{<:Any,<:CuSparseMatrixCSR}, Adjoint{<:Any,<:CuSparseMatrixCSR}} } = CuSparseMatrixCOO
116+ GPUArrays. _coo_type (:: Type{T} ) where {T<: Union{CuSparseMatrixCSC, Transpose{<:Any,<:CuSparseMatrixCSC}, Adjoint{<:Any,<:CuSparseMatrixCSC}} } = CuSparseMatrixCOO
111117
112118"""
113119Container to hold sparse matrices in block compressed sparse row (BSR) format on
326332
327333# # sparse array interface
328334
329- function SparseArrays. findnz (S:: MT ) where {MT <: AbstractCuSparseMatrix }
330- S2 = CuSparseMatrixCOO (S)
331- I = S2. rowInd
332- J = S2. colInd
333- V = S2. nzVal
334-
335- # To make it compatible with the SparseArrays.jl version
336- idxs = sortperm (J)
337- I = I[idxs]
338- J = J[idxs]
339- V = V[idxs]
340-
341- return (I, J, V)
342- end
343-
344335function SparseArrays. sparsevec (I:: CuArray{Ti} , V:: CuArray{Tv} , n:: Integer ) where {Ti,Tv}
345336 CuSparseVector (I, V, n)
346337end
@@ -396,16 +387,6 @@ function _cuda_spdiagm_internal(kv::Pair{T,<:CuVector}...) where {T<:Integer}
396387 return I, J, V, m, n
397388end
398389
399- LinearAlgebra. issymmetric (M:: Union{CuSparseMatrixCSC,CuSparseMatrixCSR} ) = size (M, 1 ) == size (M, 2 ) ? norm (M - transpose (M), Inf ) == 0 : false
400- LinearAlgebra. ishermitian (M:: Union{CuSparseMatrixCSC,CuSparseMatrixCSR} ) = size (M, 1 ) == size (M, 2 ) ? norm (M - adjoint (M), Inf ) == 0 : false
401-
402- LinearAlgebra. istriu (M:: UpperTriangular{T,S} ) where {T<: BlasFloat , S<: Union{<:AbstractCuSparseMatrix, Adjoint{<:Any, <:AbstractCuSparseMatrix}, Transpose{<:Any, <:AbstractCuSparseMatrix}} } = true
403- LinearAlgebra. istril (M:: UpperTriangular{T,S} ) where {T<: BlasFloat , S<: Union{<:AbstractCuSparseMatrix, Adjoint{<:Any, <:AbstractCuSparseMatrix}, Transpose{<:Any, <:AbstractCuSparseMatrix}} } = false
404- LinearAlgebra. istriu (M:: LowerTriangular{T,S} ) where {T<: BlasFloat , S<: Union{<:AbstractCuSparseMatrix, Adjoint{<:Any, <:AbstractCuSparseMatrix}, Transpose{<:Any, <:AbstractCuSparseMatrix}} } = false
405- LinearAlgebra. istril (M:: LowerTriangular{T,S} ) where {T<: BlasFloat , S<: Union{<:AbstractCuSparseMatrix, Adjoint{<:Any, <:AbstractCuSparseMatrix}, Transpose{<:Any, <:AbstractCuSparseMatrix}} } = true
406-
407- Hermitian {T} (Mat:: CuSparseMatrix{T} ) where {T} = Hermitian {eltype(Mat),typeof(Mat)} (Mat,' U' )
408-
409390SparseArrays. nnz (g:: CuSparseMatrixBSR ) = g. nnzb * g. blockDim * g. blockDim
410391
411392
@@ -550,6 +531,7 @@ CuSparseMatrixCSR{T}(Mat::Adjoint{Tv, <:SparseMatrixCSC}) where {T, Tv} =
550531 CuVector {T} (conj .(parent (Mat). nzval)), size (Mat))
551532CuSparseMatrixCSC {T} (Mat:: Union{Transpose{Tv, <:SparseMatrixCSC}, Adjoint{Tv, <:SparseMatrixCSC}} ) where {T, Tv} = CuSparseMatrixCSC (CuSparseMatrixCSR {T} (Mat))
552533CuSparseMatrixCSR {T} (Mat:: SparseMatrixCSC ) where {T} = CuSparseMatrixCSR (CuSparseMatrixCSC {T} (Mat))
534+ CuSparseMatrixCSR {Tv, Ti} (Mat:: SparseMatrixCSC ) where {Tv, Ti} = CuSparseMatrixCSR (CuSparseMatrixCSC {Tv} (Mat))
553535CuSparseMatrixBSR {T} (Mat:: SparseMatrixCSC , blockdim) where {T} = CuSparseMatrixBSR (CuSparseMatrixCSR {T} (Mat), blockdim)
554536CuSparseMatrixCOO {T} (Mat:: SparseMatrixCSC ) where {T} = CuSparseMatrixCOO (CuSparseMatrixCSR {T} (Mat))
555537
@@ -571,12 +553,12 @@ CuSparseMatrixCSC(x::Adjoint{T}) where {T} = CuSparseMatrixCSC{T}(x)
571553CuSparseMatrixCOO (x:: Transpose{T} ) where {T} = CuSparseMatrixCOO {T} (x)
572554CuSparseMatrixCOO (x:: Adjoint{T} ) where {T} = CuSparseMatrixCOO {T} (x)
573555
574- CuSparseMatrixCSR (x:: Transpose{T,<:Union{CuSparseMatrixCSC, CuSparseMatrixCSR, CuSparseMatrixCOO}} ) where {T} = CuSparseMatrixCSR (_sptranspose (parent (x)))
575- CuSparseMatrixCSC (x:: Transpose{T,<:Union{CuSparseMatrixCSC, CuSparseMatrixCSR, CuSparseMatrixCOO}} ) where {T} = CuSparseMatrixCSC (_sptranspose (parent (x)))
576- CuSparseMatrixCOO (x:: Transpose{T,<:Union{CuSparseMatrixCSC, CuSparseMatrixCSR, CuSparseMatrixCOO}} ) where {T} = CuSparseMatrixCOO (_sptranspose (parent (x)))
577- CuSparseMatrixCSR (x:: Adjoint{T,<:Union{CuSparseMatrixCSC, CuSparseMatrixCSR, CuSparseMatrixCOO}} ) where {T} = CuSparseMatrixCSR (_spadjoint (parent (x)))
578- CuSparseMatrixCSC (x:: Adjoint{T,<:Union{CuSparseMatrixCSC, CuSparseMatrixCSR, CuSparseMatrixCOO}} ) where {T} = CuSparseMatrixCSC (_spadjoint (parent (x)))
579- CuSparseMatrixCOO (x:: Adjoint{T,<:Union{CuSparseMatrixCSC, CuSparseMatrixCSR, CuSparseMatrixCOO}} ) where {T} = CuSparseMatrixCOO (_spadjoint (parent (x)))
556+ CuSparseMatrixCSR (x:: Transpose{T,<:Union{CuSparseMatrixCSC, CuSparseMatrixCSR, CuSparseMatrixCOO}} ) where {T} = CuSparseMatrixCSR (GPUArrays . _sptranspose (parent (x)))
557+ CuSparseMatrixCSC (x:: Transpose{T,<:Union{CuSparseMatrixCSC, CuSparseMatrixCSR, CuSparseMatrixCOO}} ) where {T} = CuSparseMatrixCSC (GPUArrays . _sptranspose (parent (x)))
558+ CuSparseMatrixCOO (x:: Transpose{T,<:Union{CuSparseMatrixCSC, CuSparseMatrixCSR, CuSparseMatrixCOO}} ) where {T} = CuSparseMatrixCOO (GPUArrays . _sptranspose (parent (x)))
559+ CuSparseMatrixCSR (x:: Adjoint{T,<:Union{CuSparseMatrixCSC, CuSparseMatrixCSR, CuSparseMatrixCOO}} ) where {T} = CuSparseMatrixCSR (GPUArrays . _spadjoint (parent (x)))
560+ CuSparseMatrixCSC (x:: Adjoint{T,<:Union{CuSparseMatrixCSC, CuSparseMatrixCSR, CuSparseMatrixCOO}} ) where {T} = CuSparseMatrixCSC (GPUArrays . _spadjoint (parent (x)))
561+ CuSparseMatrixCOO (x:: Adjoint{T,<:Union{CuSparseMatrixCSC, CuSparseMatrixCSR, CuSparseMatrixCOO}} ) where {T} = CuSparseMatrixCOO (GPUArrays . _spadjoint (parent (x)))
580562
581563# gpu to cpu
582564SparseArrays. SparseVector (x:: CuSparseVector ) = SparseVector (length (x), Array (SparseArrays. nonzeroinds (x)), Array (SparseArrays. nonzeros (x)))
@@ -592,6 +574,12 @@ Base.collect(x::CuSparseMatrixCSR) = collect(SparseMatrixCSC(x))
592574Base. collect (x:: CuSparseMatrixBSR ) = collect (SparseMatrixCSC (x))
593575Base. collect (x:: CuSparseMatrixCOO ) = collect (SparseMatrixCSC (x))
594576
577+ Base. Array (x:: CuSparseVector ) = collect (SparseVector (x))
578+ Base. Array (x:: CuSparseMatrixCSC ) = collect (SparseMatrixCSC (x))
579+ Base. Array (x:: CuSparseMatrixCSR ) = collect (SparseMatrixCSC (x))
580+ Base. Array (x:: CuSparseMatrixBSR ) = collect (SparseMatrixCSC (x))
581+ Base. Array (x:: CuSparseMatrixCOO ) = collect (SparseMatrixCSC (x))
582+
595583Adapt. adapt_storage (:: Type{CuArray} , xs:: SparseVector ) = CuSparseVector (xs)
596584Adapt. adapt_storage (:: Type{CuArray} , xs:: SparseMatrixCSC ) = CuSparseMatrixCSC (xs)
597585Adapt. adapt_storage (:: Type{CuArray{T}} , xs:: SparseVector ) where {T} = CuSparseVector {T} (xs)
@@ -787,6 +775,16 @@ function Adapt.adapt_structure(to::CUDA.KernelAdaptor, x::CuSparseMatrixCSC)
787775 )
788776end
789777
778+ function GPUArrays. GPUSparseDeviceMatrixBSR (rowPtr:: CuDeviceVector{Ti, A} ,
779+ colVal:: CuDeviceVector{Ti, A} ,
780+ nzVal:: CuDeviceVector{Tv, A} ,
781+ dims:: NTuple{2, Int} ,
782+ blockDim:: Ti ,
783+ dir:: Char ,
784+ nnz:: Ti ) where {Ti, Tv, A}
785+ GPUArrays. GPUSparseDeviceMatrixBSR {Tv, Ti, CuDeviceVector{Ti, A}, CuDeviceVector{Tv, A}, A} (rowPtr, colVal, nzVal, dims, blockDim, dir, nnz)
786+ end
787+
790788function Adapt. adapt_structure (to:: CUDA.KernelAdaptor , x:: CuSparseMatrixBSR )
791789 return GPUArrays. GPUSparseDeviceMatrixBSR (
792790 adapt (to, x. rowPtr),
@@ -797,6 +795,14 @@ function Adapt.adapt_structure(to::CUDA.KernelAdaptor, x::CuSparseMatrixBSR)
797795 )
798796end
799797
798+ function GPUArrays. GPUSparseDeviceMatrixCOO (rowInd:: CuDeviceVector{Ti, A} ,
799+ colInd:: CuDeviceVector{Ti, A} ,
800+ nzVal:: CuDeviceVector{Tv, A} ,
801+ dims:: NTuple{2, Int} ,
802+ nnz:: Ti ) where {Ti, Tv, A}
803+ GPUArrays. GPUSparseDeviceMatrixCOO {Tv, Ti, CuDeviceVector{Ti, A}, CuDeviceVector{Tv, A}, A} (rowInd, colInd, nzVal, dims, nnz)
804+ end
805+
800806function Adapt. adapt_structure (to:: CUDA.KernelAdaptor , x:: CuSparseMatrixCOO )
801807 return GPUArrays. GPUSparseDeviceMatrixCOO (
802808 adapt (to, x. rowInd),
0 commit comments