Skip to content

Keep the argument-independent launch work out of per-kernel code - #900

Open
maleadt wants to merge 2 commits into
mainfrom
tb/launch-compile-time
Open

maleadt wants to merge 2 commits into
mainfrom
tb/launch-compile-time

Conversation

@maleadt

@maleadt maleadt commented Oct 16, 2026

Copy link
Copy Markdown
Member

launch_tuple and launch_kernel are compiled for every kernel, because they're specialized on the arguments, but most of what they do doesn't depend on them: normalizing the launch keywords and partitioning the ndrange (launch_config), selecting the launch mode, and after tuning the workgroup size, re-partitioning, building the final context and padding the geometry. All of that was inlined and optimized again for every new kernel. The same goes for KernelInterface's check_work_group_size, which is @inline and pulled the backend's max_work_group_dims query and its error path into each kernel's launch code.

This moves that work into launch_setup and launch_geometry in KA, and check_work_group_dims in KernelInterface, which only take the kernel type, launch configuration and backend, so they're compiled once. The kernel-typed queries (KI.kernel_function, KI.launch_configuration, KI.max_work_group_size) and KI.launch stay in launch_kernel, so the calls and their order are unchanged.

For one new GPUArrays broadcast kernel, after warm-up, host compile time on OpenCL.jl (with JuliaGPU/OpenCL.jl#565, which removes the OpenCL-side overhead) goes from 77.2 to 71.4 ms with the first commit and to 69.7 ms with the second (Julia 1.12, PoCL 7.2, medians of 3 runs). CUDA.jl and AMDGPU.jl run the same launch code, where these layers cost about 25-35 ms per kernel.

What's left per kernel is the argument conversion in prepare_arguments (including the @Const mask query) and the keyword layer of launch_tuple, which do depend on the arguments.

This bumps KernelInterface to 0.4.2. KA doesn't need it for correctness, so its compat is left at 0.4.

Tested with KA's and KernelInterface's test suites, and OpenCL.jl's KernelAbstractions, KernelInterface, broadcasting, execution and exceptions tests on PoCL.

@github-actions

github-actions Bot commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

Benchmark Results

Show table
main 6c638a4... main / 6c638a4...
const/@Const/Float32/262144 0.244 ± 0.011 ms 0.244 ± 0.0085 ms 0.997 ± 0.058
const/@Const/Float32/65536 0.079 ± 0.0036 ms 0.0788 ± 0.0032 ms 1 ± 0.062
const/@Const/Float64/262144 0.433 ± 0.015 ms 0.431 ± 0.014 ms 1 ± 0.048
const/@Const/Float64/65536 0.123 ± 0.0045 ms 0.127 ± 0.0061 ms 0.969 ± 0.058
const/unmarked/Float32/262144 0.33 ± 0.015 ms 0.342 ± 0.016 ms 0.966 ± 0.063
const/unmarked/Float32/65536 0.0984 ± 0.011 ms 0.0936 ± 0.011 ms 1.05 ± 0.17
const/unmarked/Float64/262144 0.628 ± 0.031 ms 0.597 ± 0.027 ms 1.05 ± 0.071
const/unmarked/Float64/65536 0.174 ± 0.015 ms 0.162 ± 0.011 ms 1.08 ± 0.12
dgsem/2D/Float32/fluxdiff/element 0.32 ± 0.013 ms 0.321 ± 0.012 ms 0.997 ± 0.057
dgsem/2D/Float32/fluxdiff/node E=8 0.43 ± 0.014 ms 0.431 ± 0.015 ms 0.998 ± 0.048
dgsem/2D/Float32/fluxdiff/node halfsweep E=8 0.324 ± 0.012 ms 0.321 ± 0.014 ms 1.01 ± 0.058
dgsem/2D/Float32/fluxdiff/node halfsweep v-last E=8 0.338 ± 0.015 ms 0.335 ± 0.015 ms 1.01 ± 0.063
dgsem/2D/Float32/weak/element 0.105 ± 0.0052 ms 0.106 ± 0.0093 ms 0.993 ± 0.1
dgsem/2D/Float32/weak/element private 0.125 ± 0.0015 ms 0.114 ± 0.0065 ms 1.1 ± 0.063
dgsem/2D/Float32/weak/node localmem E=1 0.103 ± 0.0056 ms 0.114 ± 0.016 ms 0.898 ± 0.14
dgsem/2D/Float32/weak/node localmem E=8 0.104 ± 0.016 ms 0.1 ± 0.016 ms 1.04 ± 0.23
dgsem/2D/Float32/weak/node localmem v-last E=1 0.159 ± 0.0082 ms 0.156 ± 0.012 ms 1.02 ± 0.092
dgsem/2D/Float32/weak/node localmem v-last E=8 0.163 ± 0.0077 ms 0.154 ± 0.0075 ms 1.06 ± 0.072
dgsem/2D/Float32/weak/node recompute E=8 0.285 ± 0.01 ms 0.282 ± 0.013 ms 1.01 ± 0.06
dgsem/2D/Float64/fluxdiff/element 0.343 ± 0.013 ms 0.331 ± 0.011 ms 1.03 ± 0.054
dgsem/2D/Float64/fluxdiff/node E=8 0.48 ± 0.014 ms 0.464 ± 0.012 ms 1.03 ± 0.041
dgsem/2D/Float64/fluxdiff/node halfsweep E=8 0.35 ± 0.015 ms 0.343 ± 0.015 ms 1.02 ± 0.064
dgsem/2D/Float64/fluxdiff/node halfsweep v-last E=8 0.341 ± 0.013 ms 0.34 ± 0.016 ms 1 ± 0.06
dgsem/2D/Float64/weak/element 0.119 ± 0.0029 ms 0.114 ± 0.0018 ms 1.04 ± 0.03
dgsem/2D/Float64/weak/element private 0.125 ± 0.0074 ms 0.122 ± 0.008 ms 1.03 ± 0.09
dgsem/2D/Float64/weak/node localmem E=1 0.105 ± 0.0022 ms 0.101 ± 0.0039 ms 1.04 ± 0.046
dgsem/2D/Float64/weak/node localmem E=8 0.102 ± 0.011 ms 0.101 ± 0.016 ms 1.01 ± 0.19
dgsem/2D/Float64/weak/node localmem v-last E=1 0.16 ± 0.0084 ms 0.161 ± 0.011 ms 0.995 ± 0.084
dgsem/2D/Float64/weak/node localmem v-last E=8 0.157 ± 0.0096 ms 0.15 ± 0.0087 ms 1.04 ± 0.088
dgsem/2D/Float64/weak/node recompute E=8 0.395 ± 0.012 ms 0.392 ± 0.015 ms 1.01 ± 0.05
dgsem/3D/Float32/fluxdiff/element 1.12 ± 0.0085 ms 1.1 ± 0.015 ms 1.02 ± 0.016
dgsem/3D/Float32/fluxdiff/node E=2 1.86 ± 0.0067 ms 1.78 ± 0.045 ms 1.05 ± 0.027
dgsem/3D/Float32/fluxdiff/node halfsweep E=1 1.17 ± 0.01 ms 1.16 ± 0.02 ms 1.01 ± 0.02
dgsem/3D/Float32/fluxdiff/node halfsweep v-last E=1 1.36 ± 0.013 ms 1.36 ± 0.039 ms 1 ± 0.03
dgsem/3D/Float32/weak/element 0.42 ± 0.013 ms 0.407 ± 0.015 ms 1.03 ± 0.05
dgsem/3D/Float32/weak/element private 0.413 ± 0.014 ms 0.403 ± 0.014 ms 1.02 ± 0.049
dgsem/3D/Float32/weak/node localmem E=1 0.549 ± 0.019 ms 0.534 ± 0.02 ms 1.03 ± 0.053
dgsem/3D/Float32/weak/node localmem E=2 0.56 ± 0.016 ms 0.535 ± 0.016 ms 1.05 ± 0.044
dgsem/3D/Float32/weak/node localmem v-last E=1 0.806 ± 0.01 ms 0.772 ± 0.0086 ms 1.05 ± 0.018
dgsem/3D/Float32/weak/node localmem v-last E=2 0.819 ± 0.013 ms 0.819 ± 0.018 ms 1 ± 0.027
dgsem/3D/Float32/weak/node recompute E=2 1.31 ± 0.011 ms 1.3 ± 0.021 ms 1.01 ± 0.018
dgsem/3D/Float32/weak/slab E=1 1.48 ± 0.021 ms 1.49 ± 0.041 ms 0.994 ± 0.031
dgsem/3D/Float32/weak/slab E=8 4.24 ± 0.035 ms 4.2 ± 0.17 ms 1.01 ± 0.042
dgsem/3D/Float32/weak/slab double-buffered E=1 0.933 ± 0.01 ms 0.939 ± 0.02 ms 0.993 ± 0.024
dgsem/3D/Float32/weak/slab double-buffered E=8 1.04 ± 0.0075 ms 1.02 ± 0.035 ms 1.02 ± 0.036
dgsem/3D/Float32/weak/slab double-buffered v-last E=1 0.93 ± 0.0076 ms 0.932 ± 0.022 ms 0.998 ± 0.024
dgsem/3D/Float32/weak/slab double-buffered v-last E=8 1.06 ± 0.01 ms 1.06 ± 0.014 ms 1 ± 0.016
dgsem/3D/Float32/weak/slab v-last E=1 1.49 ± 0.02 ms 1.5 ± 0.023 ms 0.991 ± 0.02
dgsem/3D/Float32/weak/slab v-last E=8 3.95 ± 0.031 ms 3.91 ± 0.16 ms 1.01 ± 0.041
dgsem/3D/Float64/fluxdiff/element 1.19 ± 0.009 ms 1.15 ± 0.038 ms 1.03 ± 0.035
dgsem/3D/Float64/fluxdiff/node E=2 1.96 ± 0.016 ms 1.97 ± 0.01 ms 0.996 ± 0.0097
dgsem/3D/Float64/fluxdiff/node halfsweep E=1 1.18 ± 0.023 ms 1.19 ± 0.018 ms 0.992 ± 0.025
dgsem/3D/Float64/fluxdiff/node halfsweep v-last E=1 1.42 ± 0.018 ms 1.41 ± 0.015 ms 1.01 ± 0.017
dgsem/3D/Float64/weak/element 0.48 ± 0.014 ms 0.478 ± 0.016 ms 1 ± 0.044
dgsem/3D/Float64/weak/element private 0.507 ± 0.014 ms 0.505 ± 0.013 ms 1 ± 0.037
dgsem/3D/Float64/weak/node localmem E=1 0.575 ± 0.016 ms 0.574 ± 0.015 ms 1 ± 0.038
dgsem/3D/Float64/weak/node localmem E=2 0.593 ± 0.018 ms 0.573 ± 0.026 ms 1.03 ± 0.057
dgsem/3D/Float64/weak/node localmem v-last E=1 0.858 ± 0.022 ms 0.831 ± 0.012 ms 1.03 ± 0.031
dgsem/3D/Float64/weak/node localmem v-last E=2 0.857 ± 0.017 ms 0.857 ± 0.018 ms 1 ± 0.029
dgsem/3D/Float64/weak/node recompute E=2 1.42 ± 0.012 ms 1.38 ± 0.043 ms 1.03 ± 0.033
dgsem/3D/Float64/weak/slab E=1 1.53 ± 0.017 ms 1.51 ± 0.048 ms 1.01 ± 0.034
dgsem/3D/Float64/weak/slab E=8 4.19 ± 0.083 ms 3.94 ± 0.15 ms 1.06 ± 0.045
dgsem/3D/Float64/weak/slab double-buffered E=1 0.945 ± 0.022 ms 0.932 ± 0.012 ms 1.01 ± 0.028
dgsem/3D/Float64/weak/slab double-buffered E=8 1.06 ± 0.013 ms 1.06 ± 0.0087 ms 1 ± 0.015
dgsem/3D/Float64/weak/slab double-buffered v-last E=1 0.943 ± 0.01 ms 0.944 ± 0.015 ms 0.999 ± 0.019
dgsem/3D/Float64/weak/slab double-buffered v-last E=8 1.07 ± 0.02 ms 1.08 ± 0.014 ms 0.992 ± 0.023
dgsem/3D/Float64/weak/slab v-last E=1 1.51 ± 0.011 ms 1.51 ± 0.046 ms 1 ± 0.032
dgsem/3D/Float64/weak/slab v-last E=8 3.99 ± 0.04 ms 3.86 ± 0.091 ms 1.03 ± 0.026
launch/3D static workgroup, dynamic ndrange 6.32 ± 0.41 μs 6.49 ± 0.3 μs 0.974 ± 0.077
launch/3D static workgroup, static ndrange 6.35 ± 0.78 μs 6.01 ± 0.44 μs 1.06 ± 0.15
launch/dynamic workgroup, dynamic ndrange 6.37 ± 0.84 μs 6.18 ± 0.44 μs 1.03 ± 0.16
launch/dynamic workgroup, dynamic ndrange, workgroupsize given 5.93 ± 0.49 μs 6.15 ± 0.41 μs 0.965 ± 0.1
launch/static workgroup, dynamic ndrange 6.08 ± 0.42 μs 6.24 ± 0.32 μs 0.975 ± 0.084
launch/static workgroup, static ndrange 6.76 ± 0.81 μs 5.89 ± 0.33 μs 1.15 ± 0.15
narrow workgroup/masked/W=16 0.281 ± 0.011 ms 0.275 ± 0.014 ms 1.02 ± 0.066
narrow workgroup/masked/W=4 0.278 ± 0.011 ms 0.281 ± 0.012 ms 0.988 ± 0.057
narrow workgroup/unmasked/W=16 0.271 ± 0.0089 ms 0.274 ± 0.0082 ms 0.992 ± 0.044
narrow workgroup/unmasked/W=4 0.274 ± 0.011 ms 0.272 ± 0.012 ms 1.01 ± 0.062
partition/dynamic workgroup, dynamic ndrange 0.0524 ± 0.02 μs 0.0371 ± 0.021 μs 1.41 ± 0.97
partition/static workgroup, dynamic ndrange 0.0426 ± 0.0094 μs 0.0427 ± 0.0096 μs 0.998 ± 0.31
partition/static workgroup, static ndrange 1.61 ± 0.001 ns 1.64 ± 0.011 ns 0.981 ± 0.0066
saxpy/default/Float16/1024 7.18 ± 0.4 μs 7.05 ± 0.52 μs 1.02 ± 0.095
saxpy/default/Float16/1048576 0.384 ± 0.031 ms 0.342 ± 0.022 ms 1.12 ± 0.12
saxpy/default/Float16/16384 13.4 ± 1.2 μs 13.2 ± 0.51 μs 1.02 ± 0.097
saxpy/default/Float16/2048 7.48 ± 0.4 μs 7.21 ± 0.47 μs 1.04 ± 0.087
saxpy/default/Float16/256 6.95 ± 0.53 μs 6.93 ± 0.82 μs 1 ± 0.14
saxpy/default/Float16/262144 0.108 ± 0.0092 ms 0.105 ± 0.0086 ms 1.03 ± 0.12
saxpy/default/Float16/32768 18.9 ± 1.6 μs 18.3 ± 0.77 μs 1.03 ± 0.097
saxpy/default/Float16/4096 7.97 ± 0.38 μs 8.19 ± 0.52 μs 0.973 ± 0.077
saxpy/default/Float16/512 7.23 ± 0.68 μs 7.36 ± 2.7 μs 0.983 ± 0.37
saxpy/default/Float16/64 6.51 ± 0.49 μs 6.44 ± 0.7 μs 1.01 ± 0.13
saxpy/default/Float16/65536 28 ± 1.2 μs 27 ± 1.2 μs 1.03 ± 0.065
saxpy/default/Float32/1024 7.15 ± 0.3 μs 6.98 ± 0.86 μs 1.03 ± 0.13
saxpy/default/Float32/1048576 0.416 ± 0.056 ms 0.329 ± 0.052 ms 1.26 ± 0.26
saxpy/default/Float32/16384 9.78 ± 0.49 μs 9.59 ± 0.63 μs 1.02 ± 0.084
saxpy/default/Float32/2048 8.41 ± 1.1 μs 7.28 ± 1.4 μs 1.16 ± 0.26
saxpy/default/Float32/256 7.11 ± 0.86 μs 6.72 ± 0.78 μs 1.06 ± 0.18
saxpy/default/Float32/262144 0.102 ± 0.017 ms 0.0863 ± 0.012 ms 1.18 ± 0.26
saxpy/default/Float32/32768 16.5 ± 1.1 μs 15.3 ± 1.9 μs 1.07 ± 0.15
saxpy/default/Float32/4096 8.11 ± 0.29 μs 7.29 ± 0.44 μs 1.11 ± 0.078
saxpy/default/Float32/512 7.12 ± 0.3 μs 7.32 ± 1.4 μs 0.973 ± 0.2
saxpy/default/Float32/64 6.71 ± 0.47 μs 6.41 ± 0.89 μs 1.05 ± 0.16
saxpy/default/Float32/65536 27.6 ± 4.3 μs 23.1 ± 4.8 μs 1.19 ± 0.31
saxpy/default/Float64/1024 7.41 ± 0.43 μs 7.02 ± 0.69 μs 1.05 ± 0.12
saxpy/default/Float64/1048576 0.755 ± 0.15 ms 0.639 ± 0.16 ms 1.18 ± 0.37
saxpy/default/Float64/16384 10.8 ± 0.59 μs 10.4 ± 0.87 μs 1.04 ± 0.1
saxpy/default/Float64/2048 7.72 ± 0.55 μs 7.41 ± 1 μs 1.04 ± 0.16
saxpy/default/Float64/256 6.8 ± 0.37 μs 6.66 ± 0.43 μs 1.02 ± 0.087
saxpy/default/Float64/262144 0.135 ± 0.028 ms 0.126 ± 0.017 ms 1.07 ± 0.26
saxpy/default/Float64/32768 26.6 ± 4.4 μs 20.7 ± 2.4 μs 1.28 ± 0.26
saxpy/default/Float64/4096 8.09 ± 0.46 μs 7.64 ± 1.1 μs 1.06 ± 0.16
saxpy/default/Float64/512 7.63 ± 1.2 μs 6.8 ± 0.53 μs 1.12 ± 0.2
saxpy/default/Float64/64 6.8 ± 0.57 μs 6.5 ± 0.79 μs 1.05 ± 0.15
saxpy/default/Float64/65536 0.0331 ± 0.005 ms 0.0317 ± 0.0054 ms 1.05 ± 0.24
saxpy/static workgroup=(1024,)/Float16/1024 7.03 ± 0.37 μs 6.94 ± 0.37 μs 1.01 ± 0.076
saxpy/static workgroup=(1024,)/Float16/1048576 0.375 ± 0.031 ms 0.33 ± 0.02 ms 1.14 ± 0.11
saxpy/static workgroup=(1024,)/Float16/16384 13.6 ± 0.65 μs 12.8 ± 0.45 μs 1.06 ± 0.063
saxpy/static workgroup=(1024,)/Float16/2048 7.33 ± 0.4 μs 7.42 ± 1.1 μs 0.988 ± 0.15
saxpy/static workgroup=(1024,)/Float16/256 7.33 ± 0.57 μs 6.74 ± 0.56 μs 1.09 ± 0.12
saxpy/static workgroup=(1024,)/Float16/262144 0.106 ± 0.0089 ms 0.0969 ± 0.0084 ms 1.1 ± 0.13
saxpy/static workgroup=(1024,)/Float16/32768 19.4 ± 2.2 μs 17.1 ± 0.69 μs 1.14 ± 0.13
saxpy/static workgroup=(1024,)/Float16/4096 7.82 ± 0.36 μs 7.98 ± 0.5 μs 0.979 ± 0.076
saxpy/static workgroup=(1024,)/Float16/512 7.23 ± 0.51 μs 7.14 ± 0.71 μs 1.01 ± 0.12
saxpy/static workgroup=(1024,)/Float16/64 7.33 ± 0.46 μs 6.93 ± 0.62 μs 1.06 ± 0.11
saxpy/static workgroup=(1024,)/Float16/65536 27.4 ± 4.2 μs 25.9 ± 1.2 μs 1.06 ± 0.17
saxpy/static workgroup=(1024,)/Float32/1024 6.99 ± 0.37 μs 6.92 ± 0.44 μs 1.01 ± 0.084
saxpy/static workgroup=(1024,)/Float32/1048576 0.412 ± 0.13 ms 0.298 ± 0.054 ms 1.38 ± 0.52
saxpy/static workgroup=(1024,)/Float32/16384 9.37 ± 0.71 μs 8.99 ± 0.8 μs 1.04 ± 0.12
saxpy/static workgroup=(1024,)/Float32/2048 7.08 ± 0.35 μs 6.92 ± 0.37 μs 1.02 ± 0.075
saxpy/static workgroup=(1024,)/Float32/256 7.32 ± 0.61 μs 7.07 ± 0.71 μs 1.04 ± 0.13
saxpy/static workgroup=(1024,)/Float32/262144 0.0978 ± 0.018 ms 0.0844 ± 0.013 ms 1.16 ± 0.28
saxpy/static workgroup=(1024,)/Float32/32768 16.4 ± 1.3 μs 14.3 ± 2.5 μs 1.15 ± 0.22
saxpy/static workgroup=(1024,)/Float32/4096 7.47 ± 0.38 μs 7.33 ± 0.44 μs 1.02 ± 0.08
saxpy/static workgroup=(1024,)/Float32/512 7.08 ± 0.54 μs 6.87 ± 0.35 μs 1.03 ± 0.095
saxpy/static workgroup=(1024,)/Float32/64 7.69 ± 1.3 μs 6.87 ± 0.75 μs 1.12 ± 0.22
saxpy/static workgroup=(1024,)/Float32/65536 25.2 ± 2.4 μs 22 ± 5.7 μs 1.15 ± 0.32
saxpy/static workgroup=(1024,)/Float64/1024 6.89 ± 0.33 μs 7.11 ± 1 μs 0.97 ± 0.14
saxpy/static workgroup=(1024,)/Float64/1048576 0.835 ± 0.17 ms 0.562 ± 0.082 ms 1.49 ± 0.37
saxpy/static workgroup=(1024,)/Float64/16384 10.6 ± 0.67 μs 9.78 ± 1 μs 1.09 ± 0.13
saxpy/static workgroup=(1024,)/Float64/2048 7.18 ± 0.42 μs 7.13 ± 0.41 μs 1.01 ± 0.083
saxpy/static workgroup=(1024,)/Float64/256 7.17 ± 19 μs 6.86 ± 0.36 μs 1.04 ± 2.7
saxpy/static workgroup=(1024,)/Float64/262144 0.145 ± 0.021 ms 0.121 ± 0.018 ms 1.2 ± 0.25
saxpy/static workgroup=(1024,)/Float64/32768 24.2 ± 2.7 μs 19.3 ± 6.6 μs 1.26 ± 0.45
saxpy/static workgroup=(1024,)/Float64/4096 7.61 ± 0.76 μs 7.5 ± 0.42 μs 1.01 ± 0.12
saxpy/static workgroup=(1024,)/Float64/512 8.04 ± 1.4 μs 6.92 ± 0.35 μs 1.16 ± 0.22
saxpy/static workgroup=(1024,)/Float64/64 7.13 ± 0.56 μs 6.92 ± 0.89 μs 1.03 ± 0.16
saxpy/static workgroup=(1024,)/Float64/65536 0.0336 ± 0.0044 ms 30.7 ± 6.9 μs 1.1 ± 0.29
time_to_load 0.408 ± 0.024 s 0.383 ± 0.0038 s 1.06 ± 0.062
main 6c638a4... main / 6c638a4...
const/@Const/Float32/262144 0 allocs: 0 B 5 allocs: 0.0938 kB 0
const/@Const/Float32/65536 0 allocs: 0 B 5 allocs: 0.0938 kB 0
const/@Const/Float64/262144 0 allocs: 0 B 5 allocs: 0.0938 kB 0
const/@Const/Float64/65536 0 allocs: 0 B 5 allocs: 0.0938 kB 0
const/unmarked/Float32/262144 0 allocs: 0 B 5 allocs: 0.0938 kB 0
const/unmarked/Float32/65536 0 allocs: 0 B 5 allocs: 0.0938 kB 0
const/unmarked/Float64/262144 0 allocs: 0 B 5 allocs: 0.0938 kB 0
const/unmarked/Float64/65536 0 allocs: 0 B 5 allocs: 0.0938 kB 0
dgsem/2D/Float32/fluxdiff/element 1 allocs: 16 B 6 allocs: 0.109 kB 0.143
dgsem/2D/Float32/fluxdiff/node E=8 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
dgsem/2D/Float32/fluxdiff/node halfsweep E=8 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
dgsem/2D/Float32/fluxdiff/node halfsweep v-last E=8 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
dgsem/2D/Float32/weak/element 1 allocs: 16 B 6 allocs: 0.109 kB 0.143
dgsem/2D/Float32/weak/element private 1 allocs: 16 B 6 allocs: 0.109 kB 0.143
dgsem/2D/Float32/weak/node localmem E=1 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
dgsem/2D/Float32/weak/node localmem E=8 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
dgsem/2D/Float32/weak/node localmem v-last E=1 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
dgsem/2D/Float32/weak/node localmem v-last E=8 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
dgsem/2D/Float32/weak/node recompute E=8 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
dgsem/2D/Float64/fluxdiff/element 1 allocs: 16 B 6 allocs: 0.109 kB 0.143
dgsem/2D/Float64/fluxdiff/node E=8 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
dgsem/2D/Float64/fluxdiff/node halfsweep E=8 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
dgsem/2D/Float64/fluxdiff/node halfsweep v-last E=8 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
dgsem/2D/Float64/weak/element 1 allocs: 16 B 6 allocs: 0.109 kB 0.143
dgsem/2D/Float64/weak/element private 1 allocs: 16 B 6 allocs: 0.109 kB 0.143
dgsem/2D/Float64/weak/node localmem E=1 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
dgsem/2D/Float64/weak/node localmem E=8 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
dgsem/2D/Float64/weak/node localmem v-last E=1 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
dgsem/2D/Float64/weak/node localmem v-last E=8 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
dgsem/2D/Float64/weak/node recompute E=8 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
dgsem/3D/Float32/fluxdiff/element 1 allocs: 16 B 6 allocs: 0.109 kB 0.143
dgsem/3D/Float32/fluxdiff/node E=2 4 allocs: 0.188 kB 4 allocs: 0.188 kB 1
dgsem/3D/Float32/fluxdiff/node halfsweep E=1 4 allocs: 0.188 kB 4 allocs: 0.188 kB 1
dgsem/3D/Float32/fluxdiff/node halfsweep v-last E=1 4 allocs: 0.188 kB 4 allocs: 0.188 kB 1
dgsem/3D/Float32/weak/element 1 allocs: 16 B 6 allocs: 0.109 kB 0.143
dgsem/3D/Float32/weak/element private 1 allocs: 16 B 6 allocs: 0.109 kB 0.143
dgsem/3D/Float32/weak/node localmem E=1 4 allocs: 0.188 kB 4 allocs: 0.188 kB 1
dgsem/3D/Float32/weak/node localmem E=2 4 allocs: 0.188 kB 4 allocs: 0.188 kB 1
dgsem/3D/Float32/weak/node localmem v-last E=1 4 allocs: 0.188 kB 4 allocs: 0.188 kB 1
dgsem/3D/Float32/weak/node localmem v-last E=2 4 allocs: 0.188 kB 4 allocs: 0.188 kB 1
dgsem/3D/Float32/weak/node recompute E=2 4 allocs: 0.188 kB 4 allocs: 0.188 kB 1
dgsem/3D/Float32/weak/slab E=1 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
dgsem/3D/Float32/weak/slab E=8 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
dgsem/3D/Float32/weak/slab double-buffered E=1 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
dgsem/3D/Float32/weak/slab double-buffered E=8 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
dgsem/3D/Float32/weak/slab double-buffered v-last E=1 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
dgsem/3D/Float32/weak/slab double-buffered v-last E=8 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
dgsem/3D/Float32/weak/slab v-last E=1 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
dgsem/3D/Float32/weak/slab v-last E=8 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
dgsem/3D/Float64/fluxdiff/element 1 allocs: 16 B 6 allocs: 0.109 kB 0.143
dgsem/3D/Float64/fluxdiff/node E=2 4 allocs: 0.188 kB 4 allocs: 0.188 kB 1
dgsem/3D/Float64/fluxdiff/node halfsweep E=1 4 allocs: 0.188 kB 4 allocs: 0.188 kB 1
dgsem/3D/Float64/fluxdiff/node halfsweep v-last E=1 4 allocs: 0.188 kB 4 allocs: 0.188 kB 1
dgsem/3D/Float64/weak/element 1 allocs: 16 B 6 allocs: 0.109 kB 0.143
dgsem/3D/Float64/weak/element private 1 allocs: 16 B 6 allocs: 0.109 kB 0.143
dgsem/3D/Float64/weak/node localmem E=1 4 allocs: 0.188 kB 4 allocs: 0.188 kB 1
dgsem/3D/Float64/weak/node localmem E=2 4 allocs: 0.188 kB 4 allocs: 0.188 kB 1
dgsem/3D/Float64/weak/node localmem v-last E=1 4 allocs: 0.188 kB 4 allocs: 0.188 kB 1
dgsem/3D/Float64/weak/node localmem v-last E=2 4 allocs: 0.188 kB 4 allocs: 0.188 kB 1
dgsem/3D/Float64/weak/node recompute E=2 4 allocs: 0.188 kB 4 allocs: 0.188 kB 1
dgsem/3D/Float64/weak/slab E=1 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
dgsem/3D/Float64/weak/slab E=8 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
dgsem/3D/Float64/weak/slab double-buffered E=1 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
dgsem/3D/Float64/weak/slab double-buffered E=8 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
dgsem/3D/Float64/weak/slab double-buffered v-last E=1 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
dgsem/3D/Float64/weak/slab double-buffered v-last E=8 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
dgsem/3D/Float64/weak/slab v-last E=1 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
dgsem/3D/Float64/weak/slab v-last E=8 1 allocs: 32 B 6 allocs: 0.219 kB 0.143
launch/3D static workgroup, dynamic ndrange 4 allocs: 0.125 kB 9 allocs: 0.312 kB 0.4
launch/3D static workgroup, static ndrange 4 allocs: 0.125 kB 4 allocs: 0.125 kB 1
launch/dynamic workgroup, dynamic ndrange 0 allocs: 0 B 5 allocs: 0.125 kB 0
launch/dynamic workgroup, dynamic ndrange, workgroupsize given 0 allocs: 0 B 7 allocs: 0.172 kB 0
launch/static workgroup, dynamic ndrange 0 allocs: 0 B 5 allocs: 0.0938 kB 0
launch/static workgroup, static ndrange 0 allocs: 0 B 0 allocs: 0 B
narrow workgroup/masked/W=16 0 allocs: 0 B 5 allocs: 0.172 kB 0
narrow workgroup/masked/W=4 0 allocs: 0 B 5 allocs: 0.172 kB 0
narrow workgroup/unmasked/W=16 0 allocs: 0 B 5 allocs: 0.172 kB 0
narrow workgroup/unmasked/W=4 0 allocs: 0 B 5 allocs: 0.172 kB 0
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 3 allocs: 0.0469 kB 8 allocs: 0.172 kB 0.273
saxpy/default/Float16/1048576 3 allocs: 0.0469 kB 8 allocs: 0.172 kB 0.273
saxpy/default/Float16/16384 3 allocs: 0.0469 kB 8 allocs: 0.172 kB 0.273
saxpy/default/Float16/2048 3 allocs: 0.0469 kB 8 allocs: 0.172 kB 0.273
saxpy/default/Float16/256 0 allocs: 0 B 5 allocs: 0.125 kB 0
saxpy/default/Float16/262144 3 allocs: 0.0469 kB 8 allocs: 0.172 kB 0.273
saxpy/default/Float16/32768 3 allocs: 0.0469 kB 8 allocs: 0.172 kB 0.273
saxpy/default/Float16/4096 3 allocs: 0.0469 kB 8 allocs: 0.172 kB 0.273
saxpy/default/Float16/512 3 allocs: 0.0469 kB 8 allocs: 0.172 kB 0.273
saxpy/default/Float16/64 0 allocs: 0 B 5 allocs: 0.125 kB 0
saxpy/default/Float16/65536 3 allocs: 0.0469 kB 8 allocs: 0.172 kB 0.273
saxpy/default/Float32/1024 3 allocs: 0.0469 kB 8 allocs: 0.172 kB 0.273
saxpy/default/Float32/1048576 3 allocs: 0.0469 kB 8 allocs: 0.172 kB 0.273
saxpy/default/Float32/16384 3 allocs: 0.0469 kB 8 allocs: 0.172 kB 0.273
saxpy/default/Float32/2048 3 allocs: 0.0469 kB 8 allocs: 0.172 kB 0.273
saxpy/default/Float32/256 0 allocs: 0 B 5 allocs: 0.125 kB 0
saxpy/default/Float32/262144 3 allocs: 0.0469 kB 8 allocs: 0.172 kB 0.273
saxpy/default/Float32/32768 3 allocs: 0.0469 kB 8 allocs: 0.172 kB 0.273
saxpy/default/Float32/4096 3 allocs: 0.0469 kB 8 allocs: 0.172 kB 0.273
saxpy/default/Float32/512 3 allocs: 0.0469 kB 8 allocs: 0.172 kB 0.273
saxpy/default/Float32/64 0 allocs: 0 B 5 allocs: 0.125 kB 0
saxpy/default/Float32/65536 3 allocs: 0.0469 kB 8 allocs: 0.172 kB 0.273
saxpy/default/Float64/1024 3 allocs: 0.0469 kB 8 allocs: 0.172 kB 0.273
saxpy/default/Float64/1048576 3 allocs: 0.0469 kB 8 allocs: 0.172 kB 0.273
saxpy/default/Float64/16384 3 allocs: 0.0469 kB 8 allocs: 0.172 kB 0.273
saxpy/default/Float64/2048 3 allocs: 0.0469 kB 8 allocs: 0.172 kB 0.273
saxpy/default/Float64/256 0 allocs: 0 B 5 allocs: 0.125 kB 0
saxpy/default/Float64/262144 3 allocs: 0.0469 kB 8 allocs: 0.172 kB 0.273
saxpy/default/Float64/32768 3 allocs: 0.0469 kB 8 allocs: 0.172 kB 0.273
saxpy/default/Float64/4096 3 allocs: 0.0469 kB 8 allocs: 0.172 kB 0.273
saxpy/default/Float64/512 3 allocs: 0.0469 kB 8 allocs: 0.172 kB 0.273
saxpy/default/Float64/64 0 allocs: 0 B 5 allocs: 0.125 kB 0
saxpy/default/Float64/65536 3 allocs: 0.0469 kB 8 allocs: 0.172 kB 0.273
saxpy/static workgroup=(1024,)/Float16/1024 3 allocs: 0.0469 kB 8 allocs: 0.141 kB 0.333
saxpy/static workgroup=(1024,)/Float16/1048576 3 allocs: 0.0469 kB 8 allocs: 0.141 kB 0.333
saxpy/static workgroup=(1024,)/Float16/16384 3 allocs: 0.0469 kB 8 allocs: 0.141 kB 0.333
saxpy/static workgroup=(1024,)/Float16/2048 3 allocs: 0.0469 kB 8 allocs: 0.141 kB 0.333
saxpy/static workgroup=(1024,)/Float16/256 0 allocs: 0 B 5 allocs: 0.0938 kB 0
saxpy/static workgroup=(1024,)/Float16/262144 3 allocs: 0.0469 kB 8 allocs: 0.141 kB 0.333
saxpy/static workgroup=(1024,)/Float16/32768 3 allocs: 0.0469 kB 8 allocs: 0.141 kB 0.333
saxpy/static workgroup=(1024,)/Float16/4096 3 allocs: 0.0469 kB 8 allocs: 0.141 kB 0.333
saxpy/static workgroup=(1024,)/Float16/512 3 allocs: 0.0469 kB 8 allocs: 0.141 kB 0.333
saxpy/static workgroup=(1024,)/Float16/64 0 allocs: 0 B 5 allocs: 0.0938 kB 0
saxpy/static workgroup=(1024,)/Float16/65536 3 allocs: 0.0469 kB 8 allocs: 0.141 kB 0.333
saxpy/static workgroup=(1024,)/Float32/1024 3 allocs: 0.0469 kB 8 allocs: 0.141 kB 0.333
saxpy/static workgroup=(1024,)/Float32/1048576 3 allocs: 0.0469 kB 8 allocs: 0.141 kB 0.333
saxpy/static workgroup=(1024,)/Float32/16384 3 allocs: 0.0469 kB 8 allocs: 0.141 kB 0.333
saxpy/static workgroup=(1024,)/Float32/2048 3 allocs: 0.0469 kB 8 allocs: 0.141 kB 0.333
saxpy/static workgroup=(1024,)/Float32/256 0 allocs: 0 B 5 allocs: 0.0938 kB 0
saxpy/static workgroup=(1024,)/Float32/262144 3 allocs: 0.0469 kB 8 allocs: 0.141 kB 0.333
saxpy/static workgroup=(1024,)/Float32/32768 3 allocs: 0.0469 kB 8 allocs: 0.141 kB 0.333
saxpy/static workgroup=(1024,)/Float32/4096 3 allocs: 0.0469 kB 8 allocs: 0.141 kB 0.333
saxpy/static workgroup=(1024,)/Float32/512 3 allocs: 0.0469 kB 8 allocs: 0.141 kB 0.333
saxpy/static workgroup=(1024,)/Float32/64 0 allocs: 0 B 5 allocs: 0.0938 kB 0
saxpy/static workgroup=(1024,)/Float32/65536 3 allocs: 0.0469 kB 8 allocs: 0.141 kB 0.333
saxpy/static workgroup=(1024,)/Float64/1024 3 allocs: 0.0469 kB 8 allocs: 0.141 kB 0.333
saxpy/static workgroup=(1024,)/Float64/1048576 3 allocs: 0.0469 kB 8 allocs: 0.141 kB 0.333
saxpy/static workgroup=(1024,)/Float64/16384 3 allocs: 0.0469 kB 8 allocs: 0.141 kB 0.333
saxpy/static workgroup=(1024,)/Float64/2048 3 allocs: 0.0469 kB 8 allocs: 0.141 kB 0.333
saxpy/static workgroup=(1024,)/Float64/256 0 allocs: 0 B 5 allocs: 0.0938 kB 0
saxpy/static workgroup=(1024,)/Float64/262144 3 allocs: 0.0469 kB 8 allocs: 0.141 kB 0.333
saxpy/static workgroup=(1024,)/Float64/32768 3 allocs: 0.0469 kB 8 allocs: 0.141 kB 0.333
saxpy/static workgroup=(1024,)/Float64/4096 3 allocs: 0.0469 kB 8 allocs: 0.141 kB 0.333
saxpy/static workgroup=(1024,)/Float64/512 3 allocs: 0.0469 kB 8 allocs: 0.141 kB 0.333
saxpy/static workgroup=(1024,)/Float64/64 0 allocs: 0 B 5 allocs: 0.0938 kB 0
saxpy/static workgroup=(1024,)/Float64/65536 3 allocs: 0.0469 kB 8 allocs: 0.141 kB 0.333
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).

@codecov

codecov Bot commented Oct 17, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 82.81%. Comparing base (5b27d8f) to head (6c638a4).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##            main     #900       +/-   ##
==========================================
+ Coverage   2.13%   82.81%   +80.67%     
==========================================
  Files         26       28        +2     
  Lines       2197     2473      +276     
==========================================
+ Hits          47     2048     +2001     
+ Misses      2150      425     -1725     

☔ 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.

@maleadt maleadt added runtime Host runtime: devices, queues/streams, synchronization, memory management, multi-device, profiling. latency Compile time, load time, time-to-first-execution, invalidations. labels Oct 19, 2026
`launch_tuple` and `launch_kernel` are compiled for every kernel, and
inlined `launch_config` with its partitioning, the launch mode selection,
and after tuning the workgroup size the re-partitioning, `mkcontext` and the
padding of the launch geometry. None of that depends on the arguments, so
move it into `launch_setup` and `launch_geometry`, which are compiled once
per kernel type and launch configuration. The calls and their order are
unchanged.

Host compile time for a new broadcast kernel on OpenCL.jl (with
JuliaGPU/OpenCL.jl#565), after warm-up, median of 3 runs:
77.2 -> 71.4 ms.
`check_work_group_size` is inlined into launch code that's compiled for
every kernel, and with it the backend's `max_work_group_dims` query and
the error path. Check the dimensions in a function of the backend instead.
Bump KernelInterface to 0.4.2.

Host compile time for a new broadcast kernel on OpenCL.jl (with
JuliaGPU/OpenCL.jl#565), after warm-up, median of 3 runs:
71.4 -> 69.7 ms.
@maleadt
maleadt force-pushed the tb/launch-compile-time branch from 53e17b3 to 6c638a4 Compare October 22, 2026 10:07

This branch has not been deployed

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

Labels

latency Compile time, load time, time-to-first-execution, invalidations. runtime Host runtime: devices, queues/streams, synchronization, memory management, multi-device, profiling.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant