-
Notifications
You must be signed in to change notification settings - Fork 220
/
exceptions.jl
39 lines (31 loc) · 1.12 KB
/
exceptions.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# support for device-side exceptions
## exception type
struct KernelException <: Exception
dev::CuDevice
end
function Base.showerror(io::IO, err::KernelException)
print(io, "KernelException: exception thrown during kernel execution on device $(name(err.dev))")
end
## exception handling
const exception_flags = Dict{CuContext, Mem.HostBuffer}()
# create a CPU/GPU exception flag for error signalling, and put it in the module
function create_exceptions!(mod::CuModule)
exception_flag = get!(exception_flags, mod.ctx,
Mem.alloc(Mem.Host, sizeof(Int), Mem.HOSTALLOC_DEVICEMAP))
return reinterpret(Ptr{Cvoid}, convert(CuPtr{Cvoid}, exception_flag))
end
# check the exception flags on every API call, similarly to how CUDA handles errors
function check_exceptions()
for (ctx,buf) in exception_flags
if isvalid(ctx)
ptr = convert(Ptr{Int}, buf)
flag = unsafe_load(ptr)
if flag != 0
unsafe_store!(ptr, 0)
dev = device(ctx)
throw(KernelException(dev))
end
end
end
return
end