Skip to content

Commit af58f61

Browse files
Fill in missing KA functionality (KA.functional + sparse matrices adaption from CUDAbackend) (#2740)
1 parent b24af84 commit af58f61

File tree

2 files changed

+29
-4
lines changed

2 files changed

+29
-4
lines changed

Diff for: src/CUDAKernels.jl

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
module CUDAKernels
22

33
using ..CUDA
4-
using ..CUDA: @device_override
4+
using ..CUDA: @device_override, CUSPARSE
55

66
import KernelAbstractions as KA
77

88
import StaticArrays
9+
import SparseArrays: AbstractSparseArray
910

1011
import Adapt
1112

@@ -28,9 +29,11 @@ KA.get_backend(::CuArray) = CUDABackend()
2829
KA.get_backend(::CUSPARSE.AbstractCuSparseArray) = CUDABackend()
2930
KA.synchronize(::CUDABackend) = synchronize()
3031

31-
Adapt.adapt_storage(::CUDABackend, a::Array) = Adapt.adapt(CuArray, a)
32-
Adapt.adapt_storage(::CUDABackend, a::CuArray) = a
33-
Adapt.adapt_storage(::KA.CPU, a::CuArray) = convert(Array, a)
32+
KA.functional(::CUDABackend) = CUDA.functional()
33+
34+
Adapt.adapt_storage(::CUDABackend, a::AbstractArray) = Adapt.adapt(CuArray, a)
35+
Adapt.adapt_storage(::CUDABackend, a::Union{CuArray,CUSPARSE.AbstractCuSparseArray}) = a
36+
Adapt.adapt_storage(::KA.CPU, a::Union{CuArray,CUSPARSE.AbstractCuSparseArray}) = Adapt.adapt(Array, a)
3437

3538
## memory operations
3639

Diff for: test/base/kernelabstractions.jl

+22
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,29 @@
11
import KernelAbstractions
2+
import KernelAbstractions as KA
3+
using SparseArrays
4+
using Adapt
5+
26
include(joinpath(dirname(pathof(KernelAbstractions)), "..", "test", "testsuite.jl"))
37

48
Testsuite.testsuite(()->CUDABackend(false, false), "CUDA", CUDA, CuArray, CuDeviceArray)
59
for (PreferBlocks, AlwaysInline) in Iterators.product((true, false), (true, false))
610
Testsuite.unittest_testsuite(()->CUDABackend(PreferBlocks, AlwaysInline), "CUDA", CUDA, CuDeviceArray)
711
end
12+
13+
@testset "KA.functional" begin
14+
@test KA.functional(CUDABackend()) == CUDA.functional()
15+
end
16+
17+
@testset "CUDA Backend Adapt Tests" begin
18+
# CPU → GPU
19+
A = sprand(Float32, 10, 10, 0.5) #CSC
20+
A_d = adapt(CUDABackend(), A)
21+
@test A_d isa CUSPARSE.CuSparseMatrixCSC
22+
@test adapt(CUDABackend(), A_d) |> typeof == typeof(A_d)
23+
24+
# GPU → CPU
25+
B_d = A |> cu # CuCSC
26+
B = adapt(KA.CPU(), A_d)
27+
@test B isa SparseMatrixCSC
28+
@test adapt(KA.CPU(), B) |> typeof == typeof(B)
29+
end

0 commit comments

Comments
 (0)