Skip to content

Launch @kernel kernels on any KernelInterface back end - #801

Merged
maleadt merged 2 commits into
tb/ndlaunchfrom
tb/ka-generic-launch
Sep 30, 2026
Merged

maleadt merged 2 commits into
tb/ndlaunchfrom
tb/ka-generic-launch

Conversation

@maleadt

@maleadt maleadt commented Sep 28, 2026 •

Copy link
Copy Markdown
Member

Every backend currently launches @kernel kernels with its own copy of the same ~100 lines: partitioning the ndrange (launch_config), building the hidden context (mkcontext), compiling, tuning the workgroup size, and launching. CUDA.jl, Metal.jl, oneAPI.jl, AMDGPU.jl, OpenCL.jl and PoCL each have one. The copies have drifted: CUDA and oneAPI have a prefer_blocks option, oneAPI a hand-written sizing heuristic, AMDGPU a different preliminary workgroup size. And #797 would have every one of them adopt N-d launches and 32-bit indexing separately.

With KernelInterface 0.3 (#800), KI can compile, size and launch a kernel for any backend, so KA can do the rest. This PR moves the launch into KA (src/backend_launch.jl), and PoCL is the first to use it. For a kernel on a KI backend, KA now:

  1. partitions the ndrange, and returns right away if it's empty;
  2. chooses how to launch it with select_launch (Launch @kernel kernels on N-d grids, indexing in 32 bits #797), and compiles it with KI.kernel_function for a context that carries that choice;
  3. for a kernel without a static or given workgroup size, asks KI.launch_configuration for one, passing the number of work-items. The launch doesn't depend on the tuned size, so the context type stays the same and the kernel isn't recompiled;
  4. launches it by calling the KI.Kernel, which validates the sizes against the kernel's limits.

A backend still provides, on top of KernelInterface:

  • KA.Scratchpad for @private, e.g. an MArray on CUDA or a stack allocation on PoCL;
  • its Adapt rules, e.g. for @Const;
  • optionally, workgroup size tuning in KI.launch_configuration. That's where CUDA's and oneAPI's prefer_blocks go, now that it receives the number of work-items as nitems;
  • optionally, compiler options derived from the kernel, through the new KA.compiler_options(kernel). CUDA uses it to pass maxthreads for a static workgroup size:
function KA.compiler_options(obj::KA.Kernel{CUDABackend})
    if KA.workgroupsize(obj) <: KA.StaticSize
        return (; maxthreads = prod(KA.get(KA.workgroupsize(obj))))
    else
        return (;)
    end
end

To use the generic launch, a backend needs KernelInterface's typed index queries and an N-d KI.launch, and it has to drop its overrides of KA's index functions. A backend that keeps its own (::KA.Kernel{MyBackend}) method still takes precedence, so each port can switch on its own schedule. implementations.md now lists these hooks instead of #797's launch template, and describes overriding the launch as an escape hatch that relies on KA internals (select_launch, launch_workgroupsize).

The first commit fixes a bug that every copy of the launch shared: kernels with a static ndrange and a tuned workgroup size couldn't be launched at all.

julia> fill_index!(CPU(), KA.DynamicSize(), KA.StaticSize((100_000,)))(A)
ERROR: Can not partition kernel!

You created a dynamically sized kernel, but forgot to provide runtime
parameters for the kernel. [...]

launch_config dropped the static ndrange before using it as the preliminary workgroup size. Fixing only that isn't enough, since partition then made the number of blocks part of the context type, which changed when the workgroup size was tuned after compiling (a MethodError converting the context). The number of blocks is now only static if the workgroup size is too.

It also makes launch_config check a given ndrange against a static one, which it didn't do.

@maleadt
maleadt added this pull request to stack #802 September 28, 2026 09:19
@maleadt
maleadt force-pushed the tb/ka-generic-launch branch from 9eceba1 to ab061d4 Compare September 28, 2026 09:40
@github-actions

github-actions Bot commented Sep 28, 2026 •

Copy link
Copy Markdown
Contributor

Benchmark Results

Show table
main 063ab6a... main / 063ab6a...
const/@Const/Float32/262144 0.34 ± 0.024 ms 0.286 ± 0.026 ms 1.19 ± 0.14
const/@Const/Float32/65536 0.126 ± 0.027 ms 0.115 ± 0.025 ms 1.09 ± 0.33
const/@Const/Float64/262144 0.435 ± 0.021 ms 0.423 ± 0.028 ms 1.03 ± 0.084
const/@Const/Float64/65536 0.157 ± 0.027 ms 0.166 ± 0.014 ms 0.948 ± 0.18
const/unmarked/Float32/262144 1.16 ± 0.038 ms 1.21 ± 0.036 ms 0.958 ± 0.042
const/unmarked/Float32/65536 0.326 ± 0.034 ms 0.321 ± 0.032 ms 1.02 ± 0.15
const/unmarked/Float64/262144 2.61 ± 0.03 ms 1.38 ± 0.036 ms 1.89 ± 0.055
const/unmarked/Float64/65536 0.393 ± 0.033 ms 0.378 ± 0.039 ms 1.04 ± 0.14
launch/3D static workgroup, dynamic ndrange 0.0707 ± 0.017 ms 0.0726 ± 0.019 ms 0.974 ± 0.35
launch/3D static workgroup, static ndrange 0.0713 ± 0.013 ms 0.0726 ± 0.013 ms 0.982 ± 0.25
launch/dynamic workgroup, dynamic ndrange 0.0723 ± 0.027 ms 0.0707 ± 0.032 ms 1.02 ± 0.6
launch/dynamic workgroup, dynamic ndrange, workgroupsize given 0.0698 ± 0.032 ms 0.071 ± 0.031 ms 0.984 ± 0.63
launch/static workgroup, dynamic ndrange 0.0708 ± 0.025 ms 0.073 ± 0.014 ms 0.97 ± 0.39
launch/static workgroup, static ndrange 0.0712 ± 0.017 ms 0.0725 ± 0.019 ms 0.981 ± 0.35
partition/dynamic workgroup, dynamic ndrange 0.0582 ± 0.0095 μs 0.0617 ± 0.001 μs 0.943 ± 0.15
partition/static workgroup, dynamic ndrange 0.0643 ± 0.012 μs 0.0769 ± 0.013 μs 0.836 ± 0.21
partition/static workgroup, static ndrange 1.56 ± 0.92 ns 1.55 ± 0.01 ns 1.01 ± 0.59
saxpy/default/Float16/1024 0.0718 ± 0.029 ms 0.0725 ± 0.026 ms 0.99 ± 0.53
saxpy/default/Float16/1048576 0.796 ± 0.037 ms 0.797 ± 0.038 ms 0.999 ± 0.067
saxpy/default/Float16/16384 0.0623 ± 0.031 ms 0.0632 ± 0.033 ms 0.986 ± 0.71
saxpy/default/Float16/2048 0.0718 ± 0.028 ms 0.0749 ± 0.025 ms 0.958 ± 0.5
saxpy/default/Float16/256 0.073 ± 0.022 ms 0.0723 ± 0.027 ms 1.01 ± 0.48
saxpy/default/Float16/262144 0.248 ± 0.034 ms 0.247 ± 0.034 ms 1 ± 0.2
saxpy/default/Float16/32768 0.0733 ± 0.031 ms 0.0723 ± 0.031 ms 1.01 ± 0.61
saxpy/default/Float16/4096 0.0766 ± 0.031 ms 0.0737 ± 0.031 ms 1.04 ± 0.61
saxpy/default/Float16/512 0.0729 ± 0.028 ms 0.0727 ± 0.025 ms 1 ± 0.51
saxpy/default/Float16/64 0.0729 ± 0.027 ms 0.0733 ± 0.015 ms 0.995 ± 0.43
saxpy/default/Float16/65536 0.0952 ± 0.031 ms 0.0929 ± 0.029 ms 1.02 ± 0.46
saxpy/default/Float32/1024 0.0726 ± 0.016 ms 0.0714 ± 0.024 ms 1.02 ± 0.4
saxpy/default/Float32/1048576 0.495 ± 0.042 ms 0.381 ± 0.032 ms 1.3 ± 0.16
saxpy/default/Float32/16384 0.058 ± 0.03 ms 0.0574 ± 0.03 ms 1.01 ± 0.74
saxpy/default/Float32/2048 0.0667 ± 0.033 ms 0.0725 ± 0.024 ms 0.92 ± 0.54
saxpy/default/Float32/256 0.0726 ± 0.027 ms 0.0721 ± 0.029 ms 1.01 ± 0.55
saxpy/default/Float32/262144 0.174 ± 0.031 ms 0.145 ± 0.029 ms 1.2 ± 0.32
saxpy/default/Float32/32768 0.0626 ± 0.03 ms 0.0625 ± 0.03 ms 1 ± 0.68
saxpy/default/Float32/4096 0.0681 ± 0.028 ms 0.0751 ± 0.019 ms 0.907 ± 0.44
saxpy/default/Float32/512 0.0723 ± 0.02 ms 0.0718 ± 0.014 ms 1.01 ± 0.34
saxpy/default/Float32/64 0.0732 ± 0.021 ms 0.0731 ± 0.014 ms 1 ± 0.35
saxpy/default/Float32/65536 0.0796 ± 0.031 ms 0.0776 ± 0.03 ms 1.03 ± 0.56
saxpy/default/Float64/1024 0.0725 ± 0.02 ms 0.0718 ± 0.02 ms 1.01 ± 0.4
saxpy/default/Float64/1048576 0.616 ± 0.076 ms 0.639 ± 0.085 ms 0.964 ± 0.18
saxpy/default/Float64/16384 0.0553 ± 0.028 ms 0.0563 ± 0.029 ms 0.982 ± 0.71
saxpy/default/Float64/2048 0.0644 ± 0.033 ms 0.064 ± 0.03 ms 1.01 ± 0.7
saxpy/default/Float64/256 0.0719 ± 0.029 ms 0.0713 ± 0.023 ms 1.01 ± 0.52
saxpy/default/Float64/262144 0.199 ± 0.035 ms 0.197 ± 0.036 ms 1.01 ± 0.26
saxpy/default/Float64/32768 0.0687 ± 0.031 ms 0.0701 ± 0.031 ms 0.979 ± 0.62
saxpy/default/Float64/4096 0.0658 ± 0.027 ms 0.0653 ± 0.026 ms 1.01 ± 0.57
saxpy/default/Float64/512 0.0724 ± 0.017 ms 0.0719 ± 0.011 ms 1.01 ± 0.28
saxpy/default/Float64/64 0.0733 ± 0.022 ms 0.0731 ± 0.013 ms 1 ± 0.35
saxpy/default/Float64/65536 0.0876 ± 0.031 ms 0.0927 ± 0.031 ms 0.945 ± 0.46
saxpy/static workgroup=(1024,)/Float16/1024 0.0692 ± 0.029 ms 0.0679 ± 0.032 ms 1.02 ± 0.65
saxpy/static workgroup=(1024,)/Float16/1048576 0.792 ± 0.038 ms 0.798 ± 0.039 ms 0.993 ± 0.068
saxpy/static workgroup=(1024,)/Float16/16384 0.0602 ± 0.03 ms 0.0622 ± 0.031 ms 0.968 ± 0.68
saxpy/static workgroup=(1024,)/Float16/2048 0.0685 ± 0.029 ms 0.0742 ± 0.027 ms 0.924 ± 0.51
saxpy/static workgroup=(1024,)/Float16/256 0.0703 ± 0.028 ms 0.0724 ± 0.024 ms 0.971 ± 0.5
saxpy/static workgroup=(1024,)/Float16/262144 0.245 ± 0.034 ms 0.248 ± 0.034 ms 0.988 ± 0.19
saxpy/static workgroup=(1024,)/Float16/32768 0.0713 ± 0.03 ms 0.0737 ± 0.03 ms 0.966 ± 0.56
saxpy/static workgroup=(1024,)/Float16/4096 0.0669 ± 0.031 ms 0.0706 ± 0.031 ms 0.948 ± 0.61
saxpy/static workgroup=(1024,)/Float16/512 0.0707 ± 0.026 ms 0.0728 ± 0.022 ms 0.971 ± 0.46
saxpy/static workgroup=(1024,)/Float16/64 0.07 ± 0.03 ms 0.0726 ± 0.019 ms 0.964 ± 0.48
saxpy/static workgroup=(1024,)/Float16/65536 0.0961 ± 0.029 ms 0.0971 ± 0.029 ms 0.989 ± 0.42
saxpy/static workgroup=(1024,)/Float32/1024 0.0701 ± 0.023 ms 0.0723 ± 0.021 ms 0.968 ± 0.42
saxpy/static workgroup=(1024,)/Float32/1048576 0.495 ± 0.038 ms 0.405 ± 0.036 ms 1.22 ± 0.14
saxpy/static workgroup=(1024,)/Float32/16384 0.0578 ± 0.028 ms 0.0602 ± 0.028 ms 0.959 ± 0.65
saxpy/static workgroup=(1024,)/Float32/2048 0.062 ± 0.031 ms 0.0723 ± 0.028 ms 0.857 ± 0.54
saxpy/static workgroup=(1024,)/Float32/256 0.0698 ± 0.028 ms 0.0729 ± 0.024 ms 0.957 ± 0.49
saxpy/static workgroup=(1024,)/Float32/262144 0.173 ± 0.029 ms 0.151 ± 0.028 ms 1.15 ± 0.29
saxpy/static workgroup=(1024,)/Float32/32768 0.0667 ± 0.028 ms 0.0666 ± 0.028 ms 1 ± 0.59
saxpy/static workgroup=(1024,)/Float32/4096 0.0608 ± 0.029 ms 0.0697 ± 0.028 ms 0.872 ± 0.54
saxpy/static workgroup=(1024,)/Float32/512 0.0697 ± 0.028 ms 0.0722 ± 0.018 ms 0.965 ± 0.45
saxpy/static workgroup=(1024,)/Float32/64 0.0695 ± 0.029 ms 0.0726 ± 0.022 ms 0.958 ± 0.49
saxpy/static workgroup=(1024,)/Float32/65536 0.0805 ± 0.029 ms 0.0809 ± 0.029 ms 0.995 ± 0.51
saxpy/static workgroup=(1024,)/Float64/1024 0.0697 ± 0.023 ms 0.0724 ± 0.018 ms 0.963 ± 0.4
saxpy/static workgroup=(1024,)/Float64/1048576 0.58 ± 0.049 ms 0.58 ± 0.066 ms 1 ± 0.14
saxpy/static workgroup=(1024,)/Float64/16384 0.0599 ± 0.028 ms 0.0613 ± 0.028 ms 0.978 ± 0.64
saxpy/static workgroup=(1024,)/Float64/2048 0.0602 ± 0.03 ms 0.0639 ± 0.031 ms 0.943 ± 0.66
saxpy/static workgroup=(1024,)/Float64/256 0.0703 ± 0.022 ms 0.0723 ± 0.021 ms 0.972 ± 0.42
saxpy/static workgroup=(1024,)/Float64/262144 0.199 ± 0.033 ms 0.2 ± 0.037 ms 0.996 ± 0.24
saxpy/static workgroup=(1024,)/Float64/32768 0.0697 ± 0.029 ms 0.0735 ± 0.029 ms 0.948 ± 0.54
saxpy/static workgroup=(1024,)/Float64/4096 0.0587 ± 0.027 ms 0.0617 ± 0.027 ms 0.953 ± 0.6
saxpy/static workgroup=(1024,)/Float64/512 0.0697 ± 0.028 ms 0.0719 ± 0.021 ms 0.969 ± 0.47
saxpy/static workgroup=(1024,)/Float64/64 0.0707 ± 0.024 ms 0.0728 ± 0.02 ms 0.971 ± 0.42
saxpy/static workgroup=(1024,)/Float64/65536 0.0925 ± 0.031 ms 0.0945 ± 0.031 ms 0.979 ± 0.46
time_to_load 0.756 ± 0.014 s 0.779 ± 0.0051 s 0.971 ± 0.019
main 063ab6a... main / 063ab6a...
const/@Const/Float32/262144 1 allocs: 16 B 2 allocs: 32 B 0.5
const/@Const/Float32/65536 1 allocs: 16 B 2 allocs: 32 B 0.5
const/@Const/Float64/262144 1 allocs: 16 B 2 allocs: 32 B 0.5
const/@Const/Float64/65536 1 allocs: 16 B 2 allocs: 32 B 0.5
const/unmarked/Float32/262144 1 allocs: 16 B 2 allocs: 32 B 0.5
const/unmarked/Float32/65536 1 allocs: 16 B 2 allocs: 32 B 0.5
const/unmarked/Float64/262144 1 allocs: 16 B 2 allocs: 32 B 0.5
const/unmarked/Float64/65536 1 allocs: 16 B 2 allocs: 32 B 0.5
launch/3D static workgroup, dynamic ndrange 5 allocs: 0.141 kB 6 allocs: 0.156 kB 0.9
launch/3D static workgroup, static ndrange 6 allocs: 0.172 kB 6 allocs: 0.156 kB 1.1
launch/dynamic workgroup, dynamic ndrange 15 allocs: 0.312 kB 2 allocs: 32 B 10
launch/dynamic workgroup, dynamic ndrange, workgroupsize given 1 allocs: 16 B 2 allocs: 32 B 0.5
launch/static workgroup, dynamic ndrange 1 allocs: 16 B 2 allocs: 32 B 0.5
launch/static workgroup, static ndrange 2 allocs: 0.0469 kB 2 allocs: 32 B 1.5
partition/dynamic workgroup, dynamic ndrange 2 allocs: 0.0625 kB 2 allocs: 0.0625 kB 1
partition/static workgroup, dynamic ndrange 2 allocs: 32 B 2 allocs: 32 B 1
partition/static workgroup, static ndrange 0 allocs: 0 B 0 allocs: 0 B
saxpy/default/Float16/1024 24 allocs: 0.453 kB 5 allocs: 0.0781 kB 5.8
saxpy/default/Float16/1048576 24 allocs: 0.453 kB 5 allocs: 0.0781 kB 5.8
saxpy/default/Float16/16384 24 allocs: 0.453 kB 5 allocs: 0.0781 kB 5.8
saxpy/default/Float16/2048 24 allocs: 0.453 kB 5 allocs: 0.0781 kB 5.8
saxpy/default/Float16/256 16 allocs: 0.328 kB 2 allocs: 32 B 10.5
saxpy/default/Float16/262144 24 allocs: 0.453 kB 5 allocs: 0.0781 kB 5.8
saxpy/default/Float16/32768 24 allocs: 0.453 kB 5 allocs: 0.0781 kB 5.8
saxpy/default/Float16/4096 24 allocs: 0.453 kB 5 allocs: 0.0781 kB 5.8
saxpy/default/Float16/512 24 allocs: 0.453 kB 5 allocs: 0.0781 kB 5.8
saxpy/default/Float16/64 16 allocs: 0.328 kB 2 allocs: 32 B 10.5
saxpy/default/Float16/65536 24 allocs: 0.453 kB 5 allocs: 0.0781 kB 5.8
saxpy/default/Float32/1024 24 allocs: 0.453 kB 5 allocs: 0.0781 kB 5.8
saxpy/default/Float32/1048576 24 allocs: 0.453 kB 5 allocs: 0.0781 kB 5.8
saxpy/default/Float32/16384 24 allocs: 0.453 kB 5 allocs: 0.0781 kB 5.8
saxpy/default/Float32/2048 24 allocs: 0.453 kB 5 allocs: 0.0781 kB 5.8
saxpy/default/Float32/256 16 allocs: 0.328 kB 2 allocs: 32 B 10.5
saxpy/default/Float32/262144 24 allocs: 0.453 kB 5 allocs: 0.0781 kB 5.8
saxpy/default/Float32/32768 24 allocs: 0.453 kB 5 allocs: 0.0781 kB 5.8
saxpy/default/Float32/4096 24 allocs: 0.453 kB 5 allocs: 0.0781 kB 5.8
saxpy/default/Float32/512 24 allocs: 0.453 kB 5 allocs: 0.0781 kB 5.8
saxpy/default/Float32/64 16 allocs: 0.328 kB 2 allocs: 32 B 10.5
saxpy/default/Float32/65536 24 allocs: 0.453 kB 5 allocs: 0.0781 kB 5.8
saxpy/default/Float64/1024 24 allocs: 0.453 kB 5 allocs: 0.0781 kB 5.8
saxpy/default/Float64/1048576 24 allocs: 0.453 kB 5 allocs: 0.0781 kB 5.8
saxpy/default/Float64/16384 24 allocs: 0.453 kB 5 allocs: 0.0781 kB 5.8
saxpy/default/Float64/2048 24 allocs: 0.453 kB 5 allocs: 0.0781 kB 5.8
saxpy/default/Float64/256 16 allocs: 0.328 kB 2 allocs: 32 B 10.5
saxpy/default/Float64/262144 24 allocs: 0.453 kB 5 allocs: 0.0781 kB 5.8
saxpy/default/Float64/32768 24 allocs: 0.453 kB 5 allocs: 0.0781 kB 5.8
saxpy/default/Float64/4096 24 allocs: 0.453 kB 5 allocs: 0.0781 kB 5.8
saxpy/default/Float64/512 24 allocs: 0.453 kB 5 allocs: 0.0781 kB 5.8
saxpy/default/Float64/64 16 allocs: 0.328 kB 2 allocs: 32 B 10.5
saxpy/default/Float64/65536 24 allocs: 0.453 kB 5 allocs: 0.0781 kB 5.8
saxpy/static workgroup=(1024,)/Float16/1024 4 allocs: 0.0625 kB 5 allocs: 0.0781 kB 0.8
saxpy/static workgroup=(1024,)/Float16/1048576 4 allocs: 0.0625 kB 5 allocs: 0.0781 kB 0.8
saxpy/static workgroup=(1024,)/Float16/16384 4 allocs: 0.0625 kB 5 allocs: 0.0781 kB 0.8
saxpy/static workgroup=(1024,)/Float16/2048 4 allocs: 0.0625 kB 5 allocs: 0.0781 kB 0.8
saxpy/static workgroup=(1024,)/Float16/256 1 allocs: 16 B 2 allocs: 32 B 0.5
saxpy/static workgroup=(1024,)/Float16/262144 4 allocs: 0.0625 kB 5 allocs: 0.0781 kB 0.8
saxpy/static workgroup=(1024,)/Float16/32768 4 allocs: 0.0625 kB 5 allocs: 0.0781 kB 0.8
saxpy/static workgroup=(1024,)/Float16/4096 4 allocs: 0.0625 kB 5 allocs: 0.0781 kB 0.8
saxpy/static workgroup=(1024,)/Float16/512 4 allocs: 0.0625 kB 5 allocs: 0.0781 kB 0.8
saxpy/static workgroup=(1024,)/Float16/64 1 allocs: 16 B 2 allocs: 32 B 0.5
saxpy/static workgroup=(1024,)/Float16/65536 4 allocs: 0.0625 kB 5 allocs: 0.0781 kB 0.8
saxpy/static workgroup=(1024,)/Float32/1024 4 allocs: 0.0625 kB 5 allocs: 0.0781 kB 0.8
saxpy/static workgroup=(1024,)/Float32/1048576 4 allocs: 0.0625 kB 5 allocs: 0.0781 kB 0.8
saxpy/static workgroup=(1024,)/Float32/16384 4 allocs: 0.0625 kB 5 allocs: 0.0781 kB 0.8
saxpy/static workgroup=(1024,)/Float32/2048 4 allocs: 0.0625 kB 5 allocs: 0.0781 kB 0.8
saxpy/static workgroup=(1024,)/Float32/256 1 allocs: 16 B 2 allocs: 32 B 0.5
saxpy/static workgroup=(1024,)/Float32/262144 4 allocs: 0.0625 kB 5 allocs: 0.0781 kB 0.8
saxpy/static workgroup=(1024,)/Float32/32768 4 allocs: 0.0625 kB 5 allocs: 0.0781 kB 0.8
saxpy/static workgroup=(1024,)/Float32/4096 4 allocs: 0.0625 kB 5 allocs: 0.0781 kB 0.8
saxpy/static workgroup=(1024,)/Float32/512 4 allocs: 0.0625 kB 5 allocs: 0.0781 kB 0.8
saxpy/static workgroup=(1024,)/Float32/64 1 allocs: 16 B 2 allocs: 32 B 0.5
saxpy/static workgroup=(1024,)/Float32/65536 4 allocs: 0.0625 kB 5 allocs: 0.0781 kB 0.8
saxpy/static workgroup=(1024,)/Float64/1024 4 allocs: 0.0625 kB 5 allocs: 0.0781 kB 0.8
saxpy/static workgroup=(1024,)/Float64/1048576 4 allocs: 0.0625 kB 5 allocs: 0.0781 kB 0.8
saxpy/static workgroup=(1024,)/Float64/16384 4 allocs: 0.0625 kB 5 allocs: 0.0781 kB 0.8
saxpy/static workgroup=(1024,)/Float64/2048 4 allocs: 0.0625 kB 5 allocs: 0.0781 kB 0.8
saxpy/static workgroup=(1024,)/Float64/256 1 allocs: 16 B 2 allocs: 32 B 0.5
saxpy/static workgroup=(1024,)/Float64/262144 4 allocs: 0.0625 kB 5 allocs: 0.0781 kB 0.8
saxpy/static workgroup=(1024,)/Float64/32768 4 allocs: 0.0625 kB 5 allocs: 0.0781 kB 0.8
saxpy/static workgroup=(1024,)/Float64/4096 4 allocs: 0.0625 kB 5 allocs: 0.0781 kB 0.8
saxpy/static workgroup=(1024,)/Float64/512 4 allocs: 0.0625 kB 5 allocs: 0.0781 kB 0.8
saxpy/static workgroup=(1024,)/Float64/64 1 allocs: 16 B 2 allocs: 32 B 0.5
saxpy/static workgroup=(1024,)/Float64/65536 4 allocs: 0.0625 kB 5 allocs: 0.0781 kB 0.8
time_to_load 0.2 k allocs: 11.8 kB 0.2 k allocs: 11.8 kB 1

Benchmark Plots

A plot of the benchmark results have been uploaded as an artifact to the workflow run for this PR.
Go to "Actions"->"Benchmark a pull request"->[the most recent run]->"Artifacts" (at the bottom).

@maleadt
maleadt force-pushed the tb/ka-generic-launch branch from ab061d4 to c60e4ce Compare September 28, 2026 10:09
@maleadt
maleadt force-pushed the tb/ka-generic-launch branch from c60e4ce to 44f6987 Compare September 28, 2026 10:14
@maleadt
maleadt removed this pull request from stack #802 September 28, 2026 10:14
@maleadt
maleadt added this pull request to stack #804 September 28, 2026 10:15
@maleadt
maleadt force-pushed the tb/ka-generic-launch branch from 44f6987 to a12f889 Compare September 28, 2026 10:25
@maleadt
maleadt force-pushed the tb/ka-generic-launch branch from a12f889 to 6ec971e Compare September 28, 2026 10:31
@maleadt
maleadt force-pushed the tb/ka-generic-launch branch from bd6ef38 to c178512 Compare September 28, 2026 11:00
@maleadt
maleadt force-pushed the tb/ka-generic-launch branch from c178512 to b9804b6 Compare September 29, 2026 20:21
@maleadt
maleadt removed this pull request from stack #804 September 29, 2026 20:22
@maleadt
maleadt added this pull request to stack #808 September 29, 2026 20:22
@maleadt
maleadt force-pushed the tb/ka-generic-launch branch 2 times, most recently from c844b4d to d34353a Compare September 30, 2026 04:57
@maleadt
maleadt force-pushed the tb/ka-generic-launch branch from d34353a to 172dbdd Compare September 30, 2026 08:16
These couldn't be launched at all: `launch_config` dropped the static ndrange
before partitioning with it as the preliminary workgroup size, and `partition`
made the number of blocks static, so the context type changed when the
workgroup size was tuned after compiling the kernel. The number of blocks is
now only static if the workgroup size is too.

`launch_config` also partitions with the given ndrange, so that it is checked
against the static one.
`(::KA.Kernel{<:KI.Backend})(args...; ndrange, workgroupsize)` now partitions
the ndrange, selects the launch, compiles the kernel with `KI.kernel_function`,
tunes the workgroup size with `KI.launch_configuration` (passing the number of
work-items as `nitems`) and launches it through the `KI.Kernel`, which
validates the sizes. Backends no longer copy `mkcontext`, `launch_config` and
the launch itself; they customize it with `KI.launch_configuration` and the
new `compiler_options` hook, and still implement `Scratchpad` and their Adapt
rules. A backend's own `(::KA.Kernel{MyBackend})` method still takes
precedence. PoCL uses the generic launch.
@maleadt
maleadt force-pushed the tb/ka-generic-launch branch from 172dbdd to 063ab6a Compare September 30, 2026 08:27
@codecov

codecov Bot commented Sep 30, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 96.36364% with 2 lines in your changes missing coverage. Please review.
✅ Project coverage is 69.46%. Comparing base (7509cf4) to head (063ab6a).

Files with missing lines Patch % Lines
src/backend_launch.jl 96.15% 2 Missing ⚠️
Additional details and impacted files
@@               Coverage Diff               @@
##           tb/ndlaunch     #801      +/-   ##
===============================================
- Coverage        69.63%   69.46%   -0.17%     
===============================================
  Files               25       26       +1     
  Lines             2134     2142       +8     
===============================================
+ Hits              1486     1488       +2     
- Misses             648      654       +6     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant