Skip to content
Open
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
11 changes: 8 additions & 3 deletions lib/cl/kernel.jl
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,19 @@ mutable struct Kernel <: CLObject
const id::cl_kernel
const lock::ReentrantLock

# Intel's CPU runtime invalidates a program handle once its reference count drops to
# zero, even while kernels still use it, so keep the program the kernel was created from.
const program::Union{Program,Nothing}

# Cache settings registered by `set_indirect_memory!` with `clSetKernelExecInfo`.
# They persist across launches, so unchanged settings need no driver call.
# Guarded by `lock`; direct calls to `clSetKernelExecInfo` bypass this cache.
const indirect_pointers::Vector{Vector{CLPtr{Cvoid}}} # SVM, buffer and USM pointers
indirect_access::NTuple{3,Bool} # USM device, host and shared

function Kernel(k::cl_kernel, retain::Bool=false)
kernel = new(k, ReentrantLock(), [CLPtr{Cvoid}[] for _ in 1:3], (false, false, false))
function Kernel(k::cl_kernel, retain::Bool=false; program::Union{Program,Nothing}=nothing)
kernel = new(k, ReentrantLock(), program, [CLPtr{Cvoid}[] for _ in 1:3],
(false, false, false))
retain && clRetainKernel(kernel)
finalizer(clReleaseKernel, kernel)
return kernel
Expand Down Expand Up @@ -45,7 +50,7 @@ function Kernel(p::Program, kernel_name::String)
if err_code[] != CL_SUCCESS
throw(CLError(err_code[]))
end
return Kernel(kernel_id)
return Kernel(kernel_id; program=p)
end

function Base.getproperty(k::Kernel, s::Symbol)
Expand Down
7 changes: 7 additions & 0 deletions test/kernel.jl
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,13 @@ end
@test k.reference_count > 0
@test k.program == prg
@test typeof(k.attributes) == String

# the kernel's program stays queryable after the `Program` that built it is collected
# (a function, so that the `Program` isn't kept alive by the testset's scope)
kernel_of(src) = cl.Kernel(cl.build!(cl.Program(source=src)), "sum")
k = kernel_of(test_source)
GC.gc(true)
@test k.program isa cl.Program
end

@testset "mem/workgroup size" begin
Expand Down
Loading