Skip to content

Commit 0e89151

Browse files
authored
Merge pull request #68 from JuliaGPU/vc/events_errors
Add `Event(f, args)` to integrate code using at_async better
2 parents 11f3970 + a47988f commit 0e89151

File tree

5 files changed

+45
-14
lines changed

5 files changed

+45
-14
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "KernelAbstractions"
22
uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c"
33
authors = ["Valentin Churavy <[email protected]>"]
4-
version = "0.1.3"
4+
version = "0.1.4"
55

66
[deps]
77
Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"

src/backends/cpu.jl

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,14 @@ function Event(::CPU)
66
return NoneEvent()
77
end
88

9+
function Event(f, args...; dependencies=nothing, progress=nothing)
10+
T = Threads.@spawn begin
11+
wait(MultiEvent(dependencies), progress)
12+
f(args...)
13+
end
14+
return CPUEvent(T)
15+
end
16+
917
wait(ev::Union{CPUEvent, NoneEvent, MultiEvent}, progress=nothing) = wait(CPU(), ev, progress)
1018
wait(::CPU, ev::NoneEvent, progress=nothing) = nothing
1119

@@ -31,13 +39,11 @@ function wait(::CPU, ev::CPUEvent, progress=nothing)
3139
end
3240
end
3341

34-
function async_copy!(::CPU, A, B; dependencies=nothing)
35-
wait(CPU(), MultiEvent(dependencies), yield)
36-
copyto!(A, B)
37-
return CPUEvent(nothing)
42+
function async_copy!(::CPU, A, B; dependencies=nothing, progress=yield)
43+
Event(copyto!, A, B, dependencies=dependencies, progress=progress)
3844
end
3945

40-
function (obj::Kernel{CPU})(args...; ndrange=nothing, workgroupsize=nothing, dependencies=nothing)
46+
function (obj::Kernel{CPU})(args...; ndrange=nothing, workgroupsize=nothing, dependencies=nothing, progress=yield)
4147
if ndrange isa Integer
4248
ndrange = (ndrange,)
4349
end
@@ -57,13 +63,12 @@ function (obj::Kernel{CPU})(args...; ndrange=nothing, workgroupsize=nothing, dep
5763
ndrange = nothing
5864
end
5965

60-
t = Threads.@spawn __run(obj, ndrange, iterspace, args, dependencies, Val(dynamic))
61-
return CPUEvent(t)
66+
Event(__run, obj, ndrange, iterspace, args, Val(dynamic),
67+
dependencies=dependencies, progress=progress)
6268
end
6369

6470
# Inference barriers
65-
function __run(obj, ndrange, iterspace, args, dependencies, ::Val{dynamic}) where dynamic
66-
wait(CPU(), MultiEvent(dependencies), yield)
71+
function __run(obj, ndrange, iterspace, args, ::Val{dynamic}) where dynamic
6772
N = length(iterspace)
6873
Nthreads = Threads.nthreads()
6974
if Nthreads == 1

src/backends/cuda.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,12 +109,12 @@ function __pin!(a)
109109
return nothing
110110
end
111111

112-
function async_copy!(::CUDA, A, B; dependencies=nothing)
112+
function async_copy!(::CUDA, A, B; dependencies=nothing, progress=yield)
113113
A isa Array && __pin!(A)
114114
B isa Array && __pin!(B)
115115

116116
stream = next_stream()
117-
wait(CUDA(), MultiEvent(dependencies), yield, stream)
117+
wait(CUDA(), MultiEvent(dependencies), progress, stream)
118118
event = CuEvent(CUDAdrv.EVENT_DISABLE_TIMING)
119119
GC.@preserve A B begin
120120
destptr = pointer(A)
@@ -133,7 +133,7 @@ end
133133
###
134134
# Kernel launch
135135
###
136-
function (obj::Kernel{CUDA})(args...; ndrange=nothing, dependencies=nothing, workgroupsize=nothing)
136+
function (obj::Kernel{CUDA})(args...; ndrange=nothing, dependencies=nothing, workgroupsize=nothing, progress=yield)
137137
if ndrange isa Integer
138138
ndrange = (ndrange,)
139139
end
@@ -142,7 +142,7 @@ function (obj::Kernel{CUDA})(args...; ndrange=nothing, dependencies=nothing, wor
142142
end
143143

144144
stream = next_stream()
145-
wait(CUDA(), MultiEvent(dependencies), yield, stream)
145+
wait(CUDA(), MultiEvent(dependencies), progress, stream)
146146

147147
if KernelAbstractions.workgroupsize(obj) <: DynamicSize && workgroupsize === nothing
148148
# TODO: allow for NDRange{1, DynamicSize, DynamicSize}(nothing, nothing)

test/events.jl

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using KernelAbstractions
2+
using Test
3+
4+
@testset "Error propagation" begin
5+
let event = Event(()->error(""))
6+
@test_throws TaskFailedException wait(event)
7+
end
8+
9+
let event = Event(error, "")
10+
@test_throws CompositeException wait(MultiEvent(event))
11+
end
12+
13+
let event = Event(error, "")
14+
event = Event(wait, MultiEvent(event))
15+
@test_throws TaskFailedException wait(event)
16+
end
17+
18+
let event = Event(error, "")
19+
event = Event(()->nothing, dependencies=event)
20+
@test_throws TaskFailedException wait(event)
21+
end
22+
end

test/runtests.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ end
2121
include("nditeration.jl")
2222
end
2323

24+
@testset "Events" begin
25+
include("events.jl")
26+
end
27+
2428
include("print_test.jl")
2529

2630
include("examples.jl")

0 commit comments

Comments
 (0)