Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ ArgCheck = "dce04be8-c92d-5529-be00-80e4d2c0e197"
Atomix = "a9b6321e-bd34-4604-b9c9-b65b8de01458"
GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527"
KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c"
PrecompileTools = "aea7be01-6a6a-4083-8856-8a6e6704d82a"

[weakdeps]
CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba"
Expand All @@ -33,5 +34,6 @@ GPUArraysCore = "0.2.1"
KernelAbstractions = "0.9.43, 0.10"
Metal = "1.10.1"
OpenCL = "0.10, 1"
PrecompileTools = "1"
julia = "1.10"
oneAPI = "1, 2"
28 changes: 28 additions & 0 deletions ext/CUDACoreExt.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ module CUDACoreExt

using CUDACore
import AcceleratedKernels as AK
using PrecompileTools: @setup_workload, @compile_workload

# Groups of threads read runs of up to 4096 Float32s: on an RTX 5080, summing a 4096×4096 matrix
# along `dims=1` takes 17% less time than with a block per output.
Expand All @@ -21,4 +22,31 @@ AK.sort_tuning(::CUDABackend, ::Type{T}) where {T} =
radix_min_slice_len=1 << 19) :
AK.SortTuning(bitonic_max_len=512, radix_min_len=1 << 23, bitonic_max_slice_len=256)


# CUDACore's own workload can't cache these operations: it doesn't use the GPU, and this
# extension isn't loaded while CUDACore precompiles, so its kernels would use the default
# tunings rather than the ones above. The arrays are just large enough to select the kernels
# that a vector of 10^6 elements and a 1000×1000 matrix do. Without a functional GPU while
# precompiling, these operations are only compiled when first used. Like CUDACore's own
# workload, this needs 1.12: before, GPU code compiled while precompiling leaks into the host
# code of the image.
@static if VERSION >= v"1.12-"
@setup_workload begin
if CUDACore.functional()
@compile_workload begin
m = CuArray(ones(Float32, 256, 32))
v = vec(m)
sum(v)
sum(m; dims=1)
sum(m; dims=2)
cumsum(v)
any(iszero, v)
all(iszero, v)
sum(CuArray(ones(Int, 8192)))
synchronize()
end
end
end
end

end
Loading