Skip to content

Kernel launch overhead when launching lots of small kernels #75

Description

@mwarusz

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

I get on my laptop

0.000216 seconds
1.179281 seconds (3.70 M allocations: 177.002 MiB, 7.68% gc time)

CC @simonbyrne

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions