There is quite large overhead when launching kernels that process one element compared to a plain function call.
using KernelAbstractions
@kernel function update_ka!(dQ, Q, rka, rkb, dt)
i = @index(Global, Linear)
@inbounds begin
Q[i] += rkb * dt * dQ[i]
dQ[i] *= rka
end
end
function update_fn!(dQ, Q, rka, rkb, dt)
i = 1
@inbounds begin
Q[i] += rkb * dt * dQ[i]
dQ[i] *= rka
end
end
let
dQ = zeros(1)
Q = rand(1)
rka = rand()
rkb = rand()
dt = rand()
nreps = 100000
update_fn!(dQ, Q, rka, rkb, dt)
@time begin
for rep in 1:nreps
update_fn!(dQ, Q, rka, rkb, dt)
end
end
kernel! = update_ka!(CPU(), 256, 1)
event = kernel!(dQ, Q, rka, rkb, dt)
wait(event)
@time begin
for rep in 1:nreps
event = kernel!(dQ, Q, rka, rkb, dt)
wait(event)
end
end
end
0.000216 seconds
1.179281 seconds (3.70 M allocations: 177.002 MiB, 7.68% gc time)
There is quite large overhead when launching kernels that process one element compared to a plain function call.
I get on my laptop
CC @simonbyrne