Skip to content

POCL: cheaper launches and less compilation per kernel - #923

Merged
maleadt merged 3 commits into
mainfrom
tb/pocl-launch-cache
Oct 26, 2026
Merged

maleadt merged 3 commits into
mainfrom
tb/pocl-launch-cache

Conversation

@maleadt

@maleadt maleadt commented Oct 25, 2026 •

Copy link
Copy Markdown
Member

Split out of #906, where it was reviewed as part of the host-kernel work. It helps the queue path on its own.

  • Reuse the looked-up kernel per call site. Every launch called clfunction, which takes a global lock, builds a compiler job and queries GPUCompiler's cache. The lookup is now wrapped in GPUCompiler.cached_lookup (Add cached_lookup to cache kernel lookups per signature GPUCompiler.jl#1061, hence the bump to GPUCompiler 2.18), keyed on the session's context and the compiler options. Only the compiled kernel is cached, not the callable. A hit goes from 2797 to 56 instructions.
  • Compile the launch path once. The lookup, waiting for the kernel and the work-group size choice don't depend on the kernel's types, so they are now compiled once rather than for every new kernel or closure.
  • Query a kernel's work-group limits once, when it is created, instead of three PoCL queries per launch.

First launch of a new kernel (ms, median, empty PoCL kernel cache, 9950X, -t 8,0):

trivial stencil reduction with a new closure
main 104 118 110
this PR 74 87 83
KA 0.10.1 97 110 111

@github-actions

github-actions Bot commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

Benchmark Results

Show table
main 35c64db... main / 35c64db...
const/@Const/Float32/262144 0.343 ± 0.02 ms 0.346 ± 0.021 ms 0.992 ± 0.083
const/@Const/Float32/65536 0.116 ± 0.013 ms 0.113 ± 0.012 ms 1.03 ± 0.16
const/@Const/Float64/262144 0.567 ± 0.027 ms 0.564 ± 0.024 ms 1.01 ± 0.064
const/@Const/Float64/65536 0.248 ± 0.015 ms 0.247 ± 0.014 ms 1 ± 0.082
const/unmarked/Float32/262144 0.589 ± 0.04 ms 0.569 ± 0.033 ms 1.04 ± 0.093
const/unmarked/Float32/65536 0.174 ± 0.016 ms 0.17 ± 0.015 ms 1.02 ± 0.13
const/unmarked/Float64/262144 1.04 ± 0.07 ms 1.01 ± 0.05 ms 1.03 ± 0.086
const/unmarked/Float64/65536 0.34 ± 0.023 ms 0.337 ± 0.023 ms 1.01 ± 0.096
dgsem/2D/Float32/fluxdiff/element 0.517 ± 0.019 ms 0.519 ± 0.017 ms 0.996 ± 0.049
dgsem/2D/Float32/fluxdiff/node E=8 0.721 ± 0.022 ms 0.719 ± 0.022 ms 1 ± 0.043
dgsem/2D/Float32/fluxdiff/node halfsweep E=8 0.598 ± 0.019 ms 0.601 ± 0.024 ms 0.995 ± 0.051
dgsem/2D/Float32/fluxdiff/node halfsweep v-last E=8 0.624 ± 0.019 ms 0.627 ± 0.021 ms 0.995 ± 0.045
dgsem/2D/Float32/weak/element 0.174 ± 0.015 ms 0.173 ± 0.014 ms 1.01 ± 0.12
dgsem/2D/Float32/weak/element private 0.181 ± 0.017 ms 0.181 ± 0.012 ms 0.999 ± 0.11
dgsem/2D/Float32/weak/node localmem E=1 0.18 ± 0.016 ms 0.19 ± 0.019 ms 0.948 ± 0.13
dgsem/2D/Float32/weak/node localmem E=8 0.189 ± 0.014 ms 0.197 ± 0.018 ms 0.958 ± 0.11
dgsem/2D/Float32/weak/node localmem v-last E=1 0.242 ± 0.014 ms 0.244 ± 0.013 ms 0.993 ± 0.078
dgsem/2D/Float32/weak/node localmem v-last E=8 0.228 ± 0.013 ms 0.231 ± 0.014 ms 0.987 ± 0.082
dgsem/2D/Float32/weak/node recompute E=8 0.433 ± 0.017 ms 0.428 ± 0.019 ms 1.01 ± 0.06
dgsem/2D/Float64/fluxdiff/element 0.762 ± 0.022 ms 0.774 ± 0.025 ms 0.985 ± 0.043
dgsem/2D/Float64/fluxdiff/node E=8 0.717 ± 0.027 ms 0.723 ± 0.026 ms 0.992 ± 0.052
dgsem/2D/Float64/fluxdiff/node halfsweep E=8 0.558 ± 0.033 ms 0.554 ± 0.033 ms 1.01 ± 0.085
dgsem/2D/Float64/fluxdiff/node halfsweep v-last E=8 0.573 ± 0.016 ms 0.586 ± 0.025 ms 0.978 ± 0.051
dgsem/2D/Float64/weak/element 0.231 ± 0.017 ms 0.232 ± 0.015 ms 0.997 ± 0.097
dgsem/2D/Float64/weak/element private 0.2 ± 0.015 ms 0.202 ± 0.014 ms 0.986 ± 0.099
dgsem/2D/Float64/weak/node localmem E=1 0.191 ± 0.016 ms 0.193 ± 0.023 ms 0.992 ± 0.14
dgsem/2D/Float64/weak/node localmem E=8 0.208 ± 0.017 ms 0.207 ± 0.018 ms 1.01 ± 0.12
dgsem/2D/Float64/weak/node localmem v-last E=1 0.254 ± 0.015 ms 0.258 ± 0.02 ms 0.983 ± 0.098
dgsem/2D/Float64/weak/node localmem v-last E=8 0.252 ± 0.013 ms 0.255 ± 0.012 ms 0.987 ± 0.069
dgsem/2D/Float64/weak/node recompute E=8 0.563 ± 0.023 ms 0.566 ± 0.023 ms 0.996 ± 0.058
dgsem/3D/Float32/fluxdiff/element 1.8 ± 0.048 ms 1.79 ± 0.041 ms 1.01 ± 0.036
dgsem/3D/Float32/fluxdiff/node E=2 3.05 ± 0.099 ms 3.05 ± 0.021 ms 1 ± 0.033
dgsem/3D/Float32/fluxdiff/node halfsweep E=1 1.8 ± 0.045 ms 1.82 ± 0.016 ms 0.991 ± 0.026
dgsem/3D/Float32/fluxdiff/node halfsweep v-last E=1 1.92 ± 0.046 ms 1.89 ± 0.055 ms 1.01 ± 0.038
dgsem/3D/Float32/weak/element 0.647 ± 0.02 ms 0.645 ± 0.022 ms 1 ± 0.046
dgsem/3D/Float32/weak/element private 0.627 ± 0.032 ms 0.615 ± 0.02 ms 1.02 ± 0.061
dgsem/3D/Float32/weak/node localmem E=1 0.608 ± 0.025 ms 0.6 ± 0.022 ms 1.01 ± 0.057
dgsem/3D/Float32/weak/node localmem E=2 0.726 ± 0.034 ms 0.73 ± 0.031 ms 0.995 ± 0.063
dgsem/3D/Float32/weak/node localmem v-last E=1 0.902 ± 0.028 ms 0.881 ± 0.023 ms 1.02 ± 0.042
dgsem/3D/Float32/weak/node localmem v-last E=2 0.996 ± 0.042 ms 0.971 ± 0.047 ms 1.03 ± 0.066
dgsem/3D/Float32/weak/node recompute E=2 1.91 ± 0.023 ms 1.89 ± 0.018 ms 1.01 ± 0.016
dgsem/3D/Float32/weak/slab E=1 2.12 ± 0.046 ms 2.1 ± 0.032 ms 1.01 ± 0.027
dgsem/3D/Float32/weak/slab E=8 4.19 ± 0.052 ms 4.2 ± 0.07 ms 0.997 ± 0.021
dgsem/3D/Float32/weak/slab double-buffered E=1 1.34 ± 0.078 ms 1.35 ± 0.042 ms 0.992 ± 0.066
dgsem/3D/Float32/weak/slab double-buffered E=8 1.63 ± 0.057 ms 1.63 ± 0.043 ms 0.999 ± 0.044
dgsem/3D/Float32/weak/slab double-buffered v-last E=1 1.38 ± 0.047 ms 1.36 ± 0.04 ms 1.01 ± 0.046
dgsem/3D/Float32/weak/slab double-buffered v-last E=8 1.63 ± 0.032 ms 1.63 ± 0.033 ms 1 ± 0.028
dgsem/3D/Float32/weak/slab v-last E=1 2.16 ± 0.067 ms 2.14 ± 0.029 ms 1.01 ± 0.034
dgsem/3D/Float32/weak/slab v-last E=8 4.29 ± 0.093 ms 4.27 ± 0.1 ms 1 ± 0.033
dgsem/3D/Float64/fluxdiff/element 1.9 ± 0.052 ms 1.91 ± 0.045 ms 0.995 ± 0.036
dgsem/3D/Float64/fluxdiff/node E=2 3.01 ± 0.085 ms 3.04 ± 0.033 ms 0.989 ± 0.03
dgsem/3D/Float64/fluxdiff/node halfsweep E=1 1.95 ± 0.099 ms 1.96 ± 0.066 ms 0.993 ± 0.061
dgsem/3D/Float64/fluxdiff/node halfsweep v-last E=1 2.03 ± 0.099 ms 2.01 ± 0.11 ms 1.01 ± 0.074
dgsem/3D/Float64/weak/element 0.759 ± 0.027 ms 0.743 ± 0.027 ms 1.02 ± 0.052
dgsem/3D/Float64/weak/element private 0.722 ± 0.027 ms 0.718 ± 0.028 ms 1.01 ± 0.054
dgsem/3D/Float64/weak/node localmem E=1 0.625 ± 0.035 ms 0.629 ± 0.031 ms 0.994 ± 0.074
dgsem/3D/Float64/weak/node localmem E=2 0.781 ± 0.035 ms 0.761 ± 0.039 ms 1.03 ± 0.07
dgsem/3D/Float64/weak/node localmem v-last E=1 0.918 ± 0.041 ms 0.917 ± 0.04 ms 1 ± 0.063
dgsem/3D/Float64/weak/node localmem v-last E=2 1.01 ± 0.033 ms 1 ± 0.033 ms 1 ± 0.047
dgsem/3D/Float64/weak/node recompute E=2 2.04 ± 0.055 ms 2.09 ± 0.026 ms 0.974 ± 0.029
dgsem/3D/Float64/weak/slab E=1 2.17 ± 0.065 ms 2.21 ± 0.041 ms 0.979 ± 0.035
dgsem/3D/Float64/weak/slab E=8 4.57 ± 0.11 ms 4.64 ± 0.13 ms 0.986 ± 0.036
dgsem/3D/Float64/weak/slab double-buffered E=1 1.38 ± 0.06 ms 1.38 ± 0.083 ms 1 ± 0.074
dgsem/3D/Float64/weak/slab double-buffered E=8 1.7 ± 0.037 ms 1.74 ± 0.075 ms 0.977 ± 0.047
dgsem/3D/Float64/weak/slab double-buffered v-last E=1 1.37 ± 0.083 ms 1.38 ± 0.055 ms 0.995 ± 0.072
dgsem/3D/Float64/weak/slab double-buffered v-last E=8 1.78 ± 0.07 ms 1.78 ± 0.066 ms 1 ± 0.054
dgsem/3D/Float64/weak/slab v-last E=1 2.17 ± 0.065 ms 2.2 ± 0.036 ms 0.987 ± 0.034
dgsem/3D/Float64/weak/slab v-last E=8 4.57 ± 0.1 ms 4.54 ± 0.077 ms 1.01 ± 0.028
launch/3D static workgroup, dynamic ndrange 16.1 ± 1.7 μs 15.2 ± 3.1 μs 1.06 ± 0.25
launch/3D static workgroup, static ndrange 14.3 ± 2.1 μs 9.87 ± 5.3 μs 1.45 ± 0.8
launch/dynamic workgroup, dynamic ndrange 8.13 ± 0.5 μs 14.6 ± 1.6 μs 0.558 ± 0.072
launch/dynamic workgroup, dynamic ndrange, workgroupsize given 15 ± 6.8 μs 8.68 ± 3.7 μs 1.73 ± 1.1
launch/static workgroup, dynamic ndrange 14 ± 2.9 μs 12.3 ± 4.5 μs 1.14 ± 0.49
launch/static workgroup, static ndrange 13.3 ± 1.1 μs 13.3 ± 4.7 μs 1 ± 0.36
narrow workgroup/masked/W=16 0.756 ± 0.028 ms 0.752 ± 0.024 ms 1.01 ± 0.049
narrow workgroup/masked/W=4 0.756 ± 0.028 ms 0.752 ± 0.025 ms 1.01 ± 0.049
narrow workgroup/unmasked/W=16 0.754 ± 0.025 ms 0.75 ± 0.023 ms 1.01 ± 0.045
narrow workgroup/unmasked/W=4 0.753 ± 0.028 ms 0.751 ± 0.025 ms 1 ± 0.05
partition/dynamic workgroup, dynamic ndrange 0.0531 ± 0.01 μs 0.0523 ± 0.0085 μs 1.02 ± 0.25
partition/static workgroup, dynamic ndrange 0.0635 ± 0.01 μs 0.0608 ± 0.011 μs 1.04 ± 0.25
partition/static workgroup, static ndrange 1.31 ± 0.012 ns 1.35 ± 0.003 ns 0.97 ± 0.0092
saxpy/default/Float16/1024 16.5 ± 3.9 μs 15.3 ± 2.7 μs 1.08 ± 0.32
saxpy/default/Float16/1048576 0.544 ± 0.033 ms 0.551 ± 0.035 ms 0.987 ± 0.087
saxpy/default/Float16/16384 23.7 ± 1.5 μs 23.7 ± 1.2 μs 0.998 ± 0.081
saxpy/default/Float16/2048 19.7 ± 6.5 μs 17 ± 2.1 μs 1.16 ± 0.41
saxpy/default/Float16/256 17.4 ± 6.2 μs 15.3 ± 2.3 μs 1.13 ± 0.44
saxpy/default/Float16/262144 0.169 ± 0.015 ms 0.169 ± 0.016 ms 1 ± 0.13
saxpy/default/Float16/32768 0.0317 ± 0.002 ms 0.0322 ± 0.0027 ms 0.985 ± 0.1
saxpy/default/Float16/4096 18.9 ± 7 μs 18.8 ± 3.8 μs 1.01 ± 0.42
saxpy/default/Float16/512 15.6 ± 7.2 μs 16 ± 0.95 μs 0.976 ± 0.46
saxpy/default/Float16/64 25.1 ± 7.3 μs 14.1 ± 0.91 μs 1.78 ± 0.53
saxpy/default/Float16/65536 0.0486 ± 0.0037 ms 0.0492 ± 0.004 ms 0.987 ± 0.11
saxpy/default/Float32/1024 17.3 ± 4.3 μs 13 ± 4.1 μs 1.33 ± 0.53
saxpy/default/Float32/1048576 0.64 ± 0.077 ms 0.633 ± 0.054 ms 1.01 ± 0.15
saxpy/default/Float32/16384 25.9 ± 2.3 μs 25.7 ± 1.6 μs 1.01 ± 0.11
saxpy/default/Float32/2048 17.6 ± 2 μs 14.9 ± 3.3 μs 1.18 ± 0.3
saxpy/default/Float32/256 16.7 ± 1.1 μs 15.7 ± 0.83 μs 1.06 ± 0.091
saxpy/default/Float32/262144 0.21 ± 0.043 ms 0.212 ± 0.029 ms 0.99 ± 0.25
saxpy/default/Float32/32768 0.0355 ± 0.0025 ms 25 ± 14 μs 1.42 ± 0.78
saxpy/default/Float32/4096 18.3 ± 1.4 μs 18.3 ± 2.2 μs 1 ± 0.14
saxpy/default/Float32/512 19.6 ± 8.4 μs 12.9 ± 3.3 μs 1.52 ± 0.76
saxpy/default/Float32/64 17.7 ± 10 μs 14 ± 2.7 μs 1.26 ± 0.78
saxpy/default/Float32/65536 0.0537 ± 0.014 ms 0.0529 ± 0.02 ms 1.01 ± 0.45
saxpy/default/Float64/1024 17.8 ± 2.2 μs 12.1 ± 2.8 μs 1.47 ± 0.38
saxpy/default/Float64/1048576 1.34 ± 0.1 ms 1.3 ± 0.098 ms 1.03 ± 0.11
saxpy/default/Float64/16384 0.0361 ± 0.0024 ms 0.0358 ± 0.0024 ms 1.01 ± 0.095
saxpy/default/Float64/2048 19.2 ± 2.9 μs 14.6 ± 3.5 μs 1.31 ± 0.37
saxpy/default/Float64/256 16.5 ± 1.6 μs 11.9 ± 2.9 μs 1.39 ± 0.37
saxpy/default/Float64/262144 0.358 ± 0.04 ms 0.348 ± 0.053 ms 1.03 ± 0.19
saxpy/default/Float64/32768 0.0535 ± 0.021 ms 0.0545 ± 0.02 ms 0.982 ± 0.52
saxpy/default/Float64/4096 21.3 ± 1.6 μs 21.3 ± 3 μs 1 ± 0.16
saxpy/default/Float64/512 19.1 ± 7.8 μs 14 ± 3.1 μs 1.37 ± 0.63
saxpy/default/Float64/64 23.1 ± 9.1 μs 16 ± 3 μs 1.44 ± 0.64
saxpy/default/Float64/65536 0.12 ± 0.013 ms 0.119 ± 0.03 ms 1.01 ± 0.28
saxpy/static workgroup=(1024,)/Float16/1024 17.1 ± 3.3 μs 13.2 ± 3.6 μs 1.29 ± 0.43
saxpy/static workgroup=(1024,)/Float16/1048576 0.558 ± 0.04 ms 0.551 ± 0.04 ms 1.01 ± 0.1
saxpy/static workgroup=(1024,)/Float16/16384 23.7 ± 1.3 μs 23.1 ± 1.5 μs 1.03 ± 0.088
saxpy/static workgroup=(1024,)/Float16/2048 17.6 ± 2.7 μs 18.5 ± 7.1 μs 0.952 ± 0.39
saxpy/static workgroup=(1024,)/Float16/256 16.9 ± 1.1 μs 13.8 ± 4.4 μs 1.22 ± 0.4
saxpy/static workgroup=(1024,)/Float16/262144 0.171 ± 0.016 ms 0.17 ± 0.017 ms 1.01 ± 0.14
saxpy/static workgroup=(1024,)/Float16/32768 0.0318 ± 0.0022 ms 0.0318 ± 0.0022 ms 1 ± 0.097
saxpy/static workgroup=(1024,)/Float16/4096 18.2 ± 1.7 μs 17.8 ± 1.6 μs 1.02 ± 0.13
saxpy/static workgroup=(1024,)/Float16/512 17.9 ± 7 μs 16 ± 1.1 μs 1.11 ± 0.44
saxpy/static workgroup=(1024,)/Float16/64 16.9 ± 1.6 μs 16.6 ± 4.5 μs 1.02 ± 0.29
saxpy/static workgroup=(1024,)/Float16/65536 0.0486 ± 0.0033 ms 0.0488 ± 0.0035 ms 0.996 ± 0.098
saxpy/static workgroup=(1024,)/Float32/1024 16.9 ± 1.6 μs 14.3 ± 3 μs 1.18 ± 0.27
saxpy/static workgroup=(1024,)/Float32/1048576 0.658 ± 0.052 ms 0.666 ± 0.093 ms 0.988 ± 0.16
saxpy/static workgroup=(1024,)/Float32/16384 26 ± 1.7 μs 25.8 ± 1.8 μs 1.01 ± 0.097
saxpy/static workgroup=(1024,)/Float32/2048 17.3 ± 1.6 μs 14.4 ± 3.3 μs 1.2 ± 0.3
saxpy/static workgroup=(1024,)/Float32/256 15.5 ± 4.9 μs 15.9 ± 1.6 μs 0.972 ± 0.32
saxpy/static workgroup=(1024,)/Float32/262144 0.211 ± 0.036 ms 0.211 ± 0.035 ms 1 ± 0.24
saxpy/static workgroup=(1024,)/Float32/32768 0.0357 ± 0.0021 ms 0.0343 ± 0.013 ms 1.04 ± 0.41
saxpy/static workgroup=(1024,)/Float32/4096 18.9 ± 2.8 μs 18.5 ± 2.3 μs 1.02 ± 0.2
saxpy/static workgroup=(1024,)/Float32/512 17.1 ± 5.1 μs 14.3 ± 3.4 μs 1.2 ± 0.46
saxpy/static workgroup=(1024,)/Float32/64 17.3 ± 3.2 μs 15.8 ± 1.2 μs 1.09 ± 0.22
saxpy/static workgroup=(1024,)/Float32/65536 0.0545 ± 0.0036 ms 0.0544 ± 0.021 ms 1 ± 0.4
saxpy/static workgroup=(1024,)/Float64/1024 18.4 ± 4.7 μs 14.8 ± 3.1 μs 1.24 ± 0.41
saxpy/static workgroup=(1024,)/Float64/1048576 1.34 ± 0.071 ms 1.37 ± 0.1 ms 0.975 ± 0.088
saxpy/static workgroup=(1024,)/Float64/16384 0.0353 ± 0.0021 ms 0.0359 ± 0.0022 ms 0.983 ± 0.083
saxpy/static workgroup=(1024,)/Float64/2048 18.8 ± 3.3 μs 14.3 ± 4.1 μs 1.31 ± 0.44
saxpy/static workgroup=(1024,)/Float64/256 15.6 ± 5.6 μs 14.5 ± 5.2 μs 1.07 ± 0.55
saxpy/static workgroup=(1024,)/Float64/262144 0.378 ± 0.08 ms 0.355 ± 0.069 ms 1.06 ± 0.3
saxpy/static workgroup=(1024,)/Float64/32768 0.0542 ± 0.018 ms 0.0552 ± 0.0038 ms 0.982 ± 0.33
saxpy/static workgroup=(1024,)/Float64/4096 21.2 ± 1.5 μs 21.1 ± 2 μs 1 ± 0.12
saxpy/static workgroup=(1024,)/Float64/512 16.7 ± 1.5 μs 14.1 ± 4.9 μs 1.18 ± 0.42
saxpy/static workgroup=(1024,)/Float64/64 18.3 ± 8.6 μs 16.2 ± 2.1 μs 1.13 ± 0.55
saxpy/static workgroup=(1024,)/Float64/65536 0.119 ± 0.021 ms 0.12 ± 0.016 ms 0.993 ± 0.22
time_to_load 0.501 ± 0.0031 s 0.517 ± 0.0041 s 0.97 ± 0.0098
main 35c64db... main / 35c64db...
const/@Const/Float32/262144 0 allocs: 0 B 0 allocs: 0 B
const/@Const/Float32/65536 0 allocs: 0 B 0 allocs: 0 B
const/@Const/Float64/262144 0 allocs: 0 B 0 allocs: 0 B
const/@Const/Float64/65536 0 allocs: 0 B 0 allocs: 0 B
const/unmarked/Float32/262144 0 allocs: 0 B 0 allocs: 0 B
const/unmarked/Float32/65536 0 allocs: 0 B 0 allocs: 0 B
const/unmarked/Float64/262144 0 allocs: 0 B 0 allocs: 0 B
const/unmarked/Float64/65536 0 allocs: 0 B 0 allocs: 0 B
dgsem/2D/Float32/fluxdiff/element 1 allocs: 16 B 1 allocs: 16 B 1
dgsem/2D/Float32/fluxdiff/node E=8 1 allocs: 32 B 1 allocs: 32 B 1
dgsem/2D/Float32/fluxdiff/node halfsweep E=8 1 allocs: 32 B 1 allocs: 32 B 1
dgsem/2D/Float32/fluxdiff/node halfsweep v-last E=8 1 allocs: 32 B 1 allocs: 32 B 1
dgsem/2D/Float32/weak/element 1 allocs: 16 B 1 allocs: 16 B 1
dgsem/2D/Float32/weak/element private 1 allocs: 16 B 1 allocs: 16 B 1
dgsem/2D/Float32/weak/node localmem E=1 1 allocs: 32 B 1 allocs: 32 B 1
dgsem/2D/Float32/weak/node localmem E=8 1 allocs: 32 B 1 allocs: 32 B 1
dgsem/2D/Float32/weak/node localmem v-last E=1 1 allocs: 32 B 1 allocs: 32 B 1
dgsem/2D/Float32/weak/node localmem v-last E=8 1 allocs: 32 B 1 allocs: 32 B 1
dgsem/2D/Float32/weak/node recompute E=8 1 allocs: 32 B 1 allocs: 32 B 1
dgsem/2D/Float64/fluxdiff/element 1 allocs: 16 B 1 allocs: 16 B 1
dgsem/2D/Float64/fluxdiff/node E=8 1 allocs: 32 B 1 allocs: 32 B 1
dgsem/2D/Float64/fluxdiff/node halfsweep E=8 1 allocs: 32 B 1 allocs: 32 B 1
dgsem/2D/Float64/fluxdiff/node halfsweep v-last E=8 1 allocs: 32 B 1 allocs: 32 B 1
dgsem/2D/Float64/weak/element 1 allocs: 16 B 1 allocs: 16 B 1
dgsem/2D/Float64/weak/element private 1 allocs: 16 B 1 allocs: 16 B 1
dgsem/2D/Float64/weak/node localmem E=1 1 allocs: 32 B 1 allocs: 32 B 1
dgsem/2D/Float64/weak/node localmem E=8 1 allocs: 32 B 1 allocs: 32 B 1
dgsem/2D/Float64/weak/node localmem v-last E=1 1 allocs: 32 B 1 allocs: 32 B 1
dgsem/2D/Float64/weak/node localmem v-last E=8 1 allocs: 32 B 1 allocs: 32 B 1
dgsem/2D/Float64/weak/node recompute E=8 1 allocs: 32 B 1 allocs: 32 B 1
dgsem/3D/Float32/fluxdiff/element 1 allocs: 16 B 1 allocs: 16 B 1
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 1 allocs: 0.0469 kB 1 allocs: 0.0469 kB 1
dgsem/3D/Float32/fluxdiff/node halfsweep v-last E=1 1 allocs: 0.0469 kB 1 allocs: 0.0469 kB 1
dgsem/3D/Float32/weak/element 1 allocs: 16 B 1 allocs: 16 B 1
dgsem/3D/Float32/weak/element private 1 allocs: 16 B 1 allocs: 16 B 1
dgsem/3D/Float32/weak/node localmem E=1 1 allocs: 0.0469 kB 1 allocs: 0.0469 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 1 allocs: 0.0469 kB 1 allocs: 0.0469 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 1 allocs: 32 B 1
dgsem/3D/Float32/weak/slab E=8 1 allocs: 32 B 1 allocs: 32 B 1
dgsem/3D/Float32/weak/slab double-buffered E=1 1 allocs: 32 B 1 allocs: 32 B 1
dgsem/3D/Float32/weak/slab double-buffered E=8 1 allocs: 32 B 1 allocs: 32 B 1
dgsem/3D/Float32/weak/slab double-buffered v-last E=1 1 allocs: 32 B 1 allocs: 32 B 1
dgsem/3D/Float32/weak/slab double-buffered v-last E=8 1 allocs: 32 B 1 allocs: 32 B 1
dgsem/3D/Float32/weak/slab v-last E=1 1 allocs: 32 B 1 allocs: 32 B 1
dgsem/3D/Float32/weak/slab v-last E=8 1 allocs: 32 B 1 allocs: 32 B 1
dgsem/3D/Float64/fluxdiff/element 1 allocs: 16 B 1 allocs: 16 B 1
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 1 allocs: 0.0469 kB 1 allocs: 0.0469 kB 1
dgsem/3D/Float64/fluxdiff/node halfsweep v-last E=1 1 allocs: 0.0469 kB 1 allocs: 0.0469 kB 1
dgsem/3D/Float64/weak/element 1 allocs: 16 B 1 allocs: 16 B 1
dgsem/3D/Float64/weak/element private 1 allocs: 16 B 1 allocs: 16 B 1
dgsem/3D/Float64/weak/node localmem E=1 1 allocs: 0.0469 kB 1 allocs: 0.0469 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 1 allocs: 0.0469 kB 1 allocs: 0.0469 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 1 allocs: 32 B 1
dgsem/3D/Float64/weak/slab E=8 1 allocs: 32 B 1 allocs: 32 B 1
dgsem/3D/Float64/weak/slab double-buffered E=1 1 allocs: 32 B 1 allocs: 32 B 1
dgsem/3D/Float64/weak/slab double-buffered E=8 1 allocs: 32 B 1 allocs: 32 B 1
dgsem/3D/Float64/weak/slab double-buffered v-last E=1 1 allocs: 32 B 1 allocs: 32 B 1
dgsem/3D/Float64/weak/slab double-buffered v-last E=8 1 allocs: 32 B 1 allocs: 32 B 1
dgsem/3D/Float64/weak/slab v-last E=1 1 allocs: 32 B 1 allocs: 32 B 1
dgsem/3D/Float64/weak/slab v-last E=8 1 allocs: 32 B 1 allocs: 32 B 1
launch/3D static workgroup, dynamic ndrange 4 allocs: 0.125 kB 4 allocs: 0.125 kB 1
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 0 allocs: 0 B
launch/dynamic workgroup, dynamic ndrange, workgroupsize given 0 allocs: 0 B 0 allocs: 0 B
launch/static workgroup, dynamic ndrange 0 allocs: 0 B 0 allocs: 0 B
launch/static workgroup, static ndrange 0 allocs: 0 B 0 allocs: 0 B
narrow workgroup/masked/W=16 0 allocs: 0 B 0 allocs: 0 B
narrow workgroup/masked/W=4 0 allocs: 0 B 0 allocs: 0 B
narrow workgroup/unmasked/W=16 0 allocs: 0 B 0 allocs: 0 B
narrow workgroup/unmasked/W=4 0 allocs: 0 B 0 allocs: 0 B
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 3 allocs: 0.0469 kB 1
saxpy/default/Float16/1048576 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/default/Float16/16384 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/default/Float16/2048 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/default/Float16/256 0 allocs: 0 B 0 allocs: 0 B
saxpy/default/Float16/262144 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/default/Float16/32768 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/default/Float16/4096 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/default/Float16/512 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/default/Float16/64 0 allocs: 0 B 0 allocs: 0 B
saxpy/default/Float16/65536 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/default/Float32/1024 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/default/Float32/1048576 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/default/Float32/16384 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/default/Float32/2048 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/default/Float32/256 0 allocs: 0 B 0 allocs: 0 B
saxpy/default/Float32/262144 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/default/Float32/32768 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/default/Float32/4096 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/default/Float32/512 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/default/Float32/64 0 allocs: 0 B 0 allocs: 0 B
saxpy/default/Float32/65536 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/default/Float64/1024 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/default/Float64/1048576 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/default/Float64/16384 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/default/Float64/2048 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/default/Float64/256 0 allocs: 0 B 0 allocs: 0 B
saxpy/default/Float64/262144 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/default/Float64/32768 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/default/Float64/4096 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/default/Float64/512 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/default/Float64/64 0 allocs: 0 B 0 allocs: 0 B
saxpy/default/Float64/65536 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/static workgroup=(1024,)/Float16/1024 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/static workgroup=(1024,)/Float16/1048576 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/static workgroup=(1024,)/Float16/16384 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/static workgroup=(1024,)/Float16/2048 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/static workgroup=(1024,)/Float16/256 0 allocs: 0 B 0 allocs: 0 B
saxpy/static workgroup=(1024,)/Float16/262144 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/static workgroup=(1024,)/Float16/32768 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/static workgroup=(1024,)/Float16/4096 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/static workgroup=(1024,)/Float16/512 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/static workgroup=(1024,)/Float16/64 0 allocs: 0 B 0 allocs: 0 B
saxpy/static workgroup=(1024,)/Float16/65536 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/static workgroup=(1024,)/Float32/1024 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/static workgroup=(1024,)/Float32/1048576 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/static workgroup=(1024,)/Float32/16384 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/static workgroup=(1024,)/Float32/2048 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/static workgroup=(1024,)/Float32/256 0 allocs: 0 B 0 allocs: 0 B
saxpy/static workgroup=(1024,)/Float32/262144 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/static workgroup=(1024,)/Float32/32768 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/static workgroup=(1024,)/Float32/4096 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/static workgroup=(1024,)/Float32/512 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/static workgroup=(1024,)/Float32/64 0 allocs: 0 B 0 allocs: 0 B
saxpy/static workgroup=(1024,)/Float32/65536 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/static workgroup=(1024,)/Float64/1024 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/static workgroup=(1024,)/Float64/1048576 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/static workgroup=(1024,)/Float64/16384 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/static workgroup=(1024,)/Float64/2048 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/static workgroup=(1024,)/Float64/256 0 allocs: 0 B 0 allocs: 0 B
saxpy/static workgroup=(1024,)/Float64/262144 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/static workgroup=(1024,)/Float64/32768 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/static workgroup=(1024,)/Float64/4096 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/static workgroup=(1024,)/Float64/512 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
saxpy/static workgroup=(1024,)/Float64/64 0 allocs: 0 B 0 allocs: 0 B
saxpy/static workgroup=(1024,)/Float64/65536 3 allocs: 0.0469 kB 3 allocs: 0.0469 kB 1
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 25, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 92.85714% with 2 lines in your changes missing coverage. Please review.
✅ Project coverage is 82.50%. Comparing base (a103347) to head (35c64db).

Files with missing lines Patch % Lines
src/pocl/nanoOpenCL.jl 75.00% 2 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #923      +/-   ##
==========================================
- Coverage   82.91%   82.50%   -0.41%     
==========================================
  Files          31       31              
  Lines        2499     2510      +11     
==========================================
- Hits         2072     2071       -1     
- Misses        427      439      +12     

☔ 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 marked this pull request as draft October 25, 2026 21:25
@maleadt
maleadt marked this pull request as ready for review October 26, 2026 05:44
@maleadt
maleadt marked this pull request as draft October 26, 2026 05:45
Every launch called `clfunction`, which takes a global lock, builds a
compiler job and queries GPUCompiler's cache: about 2700 of the 9800
instructions of a small launch on the queue. Wrap the lookup in
`GPUCompiler.cached_lookup`, which remembers the compiled kernel per
callable and argument types and reuses it while the task's world age, the
session's context and the compiler options are unchanged. Only the
compiled kernel is kept, not the callable.
Each new kernel, or new closure type launched through the same `@kernel`,
inferred and compiled the POCL launch path anew, although most of it doesn't
depend on the kernel's types: looking up the compiled kernel (the lock,
compiler configuration, GPUCompiler's cache and the link), waiting for the
kernel, and the work-group size queries. Move those into functions that are
compiled once, leaving only the argument conversion and the construction of
the kernel object specialized.

This cuts the first launch of a new kernel by about a third: from 749M to
474M instructions (104 to 73 ms) for a trivial kernel, and from 886M to
654M (110 to 84 ms) for a reduction with a new closure, which puts it below
KernelAbstractions 0.10.1.
Every launch queried the kernel's maximum work-group size and preferred
work-group size multiple from PoCL, three times in all: twice to choose a
work-group size and once to check it. They don't change for a kernel, so
query them when creating it. This saves about 570 instructions per launch.
@maleadt
maleadt force-pushed the tb/pocl-launch-cache branch from 71ef0ea to 35c64db Compare October 26, 2026 07:40
@maleadt
maleadt marked this pull request as ready for review October 26, 2026 07:48
@maleadt
maleadt added this pull request to stack #926 October 26, 2026 09:51
@maleadt
maleadt merged commit f17a325 into main Oct 26, 2026
48 of 49 checks passed
@maleadt
maleadt deleted the tb/pocl-launch-cache branch October 26, 2026 09:51
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