Skip to content

Commit 37f3014

Browse files
add back sparse matrix utils (#4815)
1 parent a7b90b2 commit 37f3014

File tree

3 files changed

+29
-0
lines changed

3 files changed

+29
-0
lines changed

ext/OceananigansAMDGPUExt.jl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ using AMDGPU, AMDGPU.rocSPARSE, AMDGPU.rocFFT
66
using Oceananigans.Utils: linear_expand, __linear_ndrange, MappedCompilerMetadata
77
using KernelAbstractions: __dynamic_checkbounds, __iterspace
88
using KernelAbstractions
9+
using SparseArrays
910

1011
import Oceananigans.Architectures as AC
1112
import Oceananigans.BoundaryConditions as BC
@@ -52,6 +53,16 @@ AC.on_architecture(::ROCGPU, a::StepRangeLen) = a
5253
AC.on_architecture(arch::Distributed, a::ROCArray) = AC.on_architecture(AC.child_architecture(arch), a)
5354
AC.on_architecture(arch::Distributed, a::SubArray{<:Any, <:Any, <:ROCArray}) = AC.on_architecture(child_architecture(arch), a)
5455

56+
@inline AC.sparse_matrix_constructors(::AC.GPU{ROCBackend}, A::SparseMatrixCSC) = (ROCArray(A.colptr), ROCArray(A.rowval), ROCArray(A.nzval), (A.m, A.n))
57+
@inline AC.sparse_matrix_constructors(::AC.CPU, A::ROCSparseMatrixCSC) = (A.dims[1], A.dims[2], Int64.(Array(A.colPtr)), Int64.(Array(A.rowVal)), Array(A.nzVal))
58+
@inline AC.sparse_matrix_constructors(::AC.GPU{ROCBackend}, A::ROCSparseMatrixCSC) = (A.colPtr, A.rowVal, A.nzVal, A.dims)
59+
60+
@inline AC.sparse_matrix(::AC.GPU{ROCBackend}, constr::Tuple) = ROCSparseMatrixCSC(constr...)
61+
62+
@inline AC.on_architecture(::AC.CPU, A::ROCSparseMatrixCSC) = SparseMatrixCSC(AC.sparse_matrix_constructors(AC.CPU(), A)...)
63+
@inline AC.on_architecture(::AC.GPU{ROCBackend}, A::SparseMatrixCSC) = ROCSparseMatrixCSC(AC.sparse_matrix_constructors(AC.GPU(), A)...)
64+
@inline AC.on_architecture(::AC.GPU{ROCBackend}, A::ROCSparseMatrixCSC) = A
65+
5566
function AC.unified_array(::ROCGPU, a::AbstractArray)
5667
error("unified_array is not implemented for ROCGPU.")
5768
end

ext/OceananigansCUDAExt.jl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ using CUDA, CUDA.CUSPARSE, CUDA.CUFFT
66
using Oceananigans.Utils: linear_expand, __linear_ndrange, MappedCompilerMetadata
77
using KernelAbstractions: __dynamic_checkbounds, __iterspace
88
using KernelAbstractions
9+
using SparseArrays
910

1011
import Oceananigans.Architectures as AC
1112
import Oceananigans.BoundaryConditions as BC
@@ -73,6 +74,16 @@ AC.on_architecture(::CUDAGPU, a::StepRangeLen) = a
7374
AC.on_architecture(arch::Distributed, a::CuArray) = AC.on_architecture(AC.child_architecture(arch), a)
7475
AC.on_architecture(arch::Distributed, a::SubArray{<:Any, <:Any, <:CuArray}) = AC.on_architecture(child_architecture(arch), a)
7576

77+
@inline AC.sparse_matrix_constructors(::AC.GPU{CUDABackend}, A::SparseMatrixCSC) = (CuArray(A.colptr), CuArray(A.rowval), CuArray(A.nzval), (A.m, A.n))
78+
@inline AC.sparse_matrix_constructors(::AC.CPU, A::CuSparseMatrixCSC) = (A.dims[1], A.dims[2], Int64.(Array(A.colPtr)), Int64.(Array(A.rowVal)), Array(A.nzVal))
79+
@inline AC.sparse_matrix_constructors(::AC.GPU{CUDABackend}, A::CuSparseMatrixCSC) = (A.colPtr, A.rowVal, A.nzVal, A.dims)
80+
81+
@inline AC.sparse_matrix(::AC.GPU{CUDABackend}, constr::Tuple) = CuSparseMatrixCSC(constr...)
82+
83+
@inline AC.on_architecture(::AC.CPU, A::CuSparseMatrixCSC) = SparseMatrixCSC(AC.sparse_matrix_constructors(AC.CPU(), A)...)
84+
@inline AC.on_architecture(::AC.GPU{CUDABackend}, A::SparseMatrixCSC) = CuSparseMatrixCSC(AC.sparse_matrix_constructors(AC.GPU(), A)...)
85+
@inline AC.on_architecture(::AC.GPU{CUDABackend}, A::CuSparseMatrixCSC) = A
86+
7687
# cu alters the type of `a`, so we convert it back to the correct type
7788
AC.unified_array(::CUDAGPU, a::AbstractArray) = map(eltype(a), cu(a; unified = true))
7889

src/Architectures.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,12 @@ architecture(::SparseMatrixCSC) = CPU()
7575
architecture(::Type{T}) where {T<:AbstractArray} = architecture(Base.typename(T).wrapper)
7676
architecture(::Type{Array}) = CPU()
7777

78+
# Utils for sparse matrix manipulation
79+
@inline sparse_matrix_constructors(::CPU, A::SparseMatrixCSC) = (A.m, A.n, A.colptr, A.rowval, A.nzval)
80+
@inline sparse_matrix_constructors(::CPU, m::Number, n::Number, constr::Tuple) = (m, n, constr...)
81+
@inline sparse_matrix_constructors(::GPU, m::Number, n::Number, constr::Tuple) = (constr..., (m, n))
82+
@inline sparse_matrix(::CPU, constr::Tuple) = SparseMatrixCSC(constr...)
83+
7884
"""
7985
child_architecture(arch)
8086
@@ -97,6 +103,7 @@ on_architecture(::CPU, a::Array) = a
97103
on_architecture(::CPU, a::BitArray) = a
98104
on_architecture(::CPU, a::SubArray{<:Any, <:Any, <:Array}) = a
99105
on_architecture(::CPU, a::StepRangeLen) = a
106+
on_architecture(::CPU, A::SparseMatrixCSC) = A
100107

101108
on_architecture(arch::AbstractSerialArchitecture, a::OffsetArray) =
102109
OffsetArray(on_architecture(arch, a.parent), a.offsets...)

0 commit comments

Comments
 (0)