Skip to content

Require PoCL's NUMA-aware scheduling, and measure the NUMA example - #928

Merged
maleadt merged 1 commit into
tb/pocl-parallel-zerosfrom
tb/pocl-numa-docs
Oct 26, 2026
Merged

maleadt merged 1 commit into
tb/pocl-parallel-zerosfrom
tb/pocl-numa-docs

Conversation

@maleadt

@maleadt maleadt commented Oct 26, 2026 •

Copy link
Copy Markdown
Member

KernelAbstractions 0.10 lost much of the NUMA performance of 0.9's CPU(; static=true): SAXPY on 2x EPYC 7763 dropped from ~330 to ~250 GB/s. There were two causes:

  • Dynamic work-group scheduling. PoCL dealt out a kernel's workgroups to whichever thread asked first, so a kernel that initializes memory and a later kernel working on it ran the same workgroups on different threads. That ruins first-touch placement.
  • Masked memory accesses. KA 0.10.1 compiled bounds checks into masked memory accesses, which are microcoded on Zen 2/3. POCL: vectorizable kernels without bounds checks, and FMA for muladd #922 (0.10.2) fixed this.

pocl_standalone_jll 7.2.3+1 (JuliaPackaging/Yggdrasil#15319, from JuliaGPU/pocl#7 and #8) fixes the PoCL side:

  • Static blocks. Each thread gets a contiguous block of workgroups. Threads that run out take over unstarted blocks or the back halves of others, which keeps load balance.
  • Topology-aware pinning. POCL_AFFINITY=1 pins the threads to the CPUs the process may use, one per core first, spread over the NUMA domains.

This PR:

  • Raises the compat bound to 7.2.3. Compat can't name a build, but 7.2.3 resolves to +1, and it excludes the 7.2.2 builds without these changes.

  • Rewrites the NUMA example's remarks to explain how scheduling, pinning and initialization (including zeros/ones from POCL: initialize large arrays with a kernel in zeros and ones #927) interact.

  • Replaces the "not measured on NUMA yet" note with measurements on 2x EPYC 7502 (2 domains), using the registered JLL and POCL: initialize large arrays with a kernel in zeros and ones #927. SAXPY bandwidth in GB/s:

    threads initialization POCL_AFFINITY=1 unset
    64 kernel, or zeros/ones 242 130–155
    64 serial 142 137
    32 kernel, or zeros/ones 157 121–135
    32 serial 124 121–139

    Pinned Threads.@threads :static gets 240 GB/s with 64 threads. On a single domain (Ryzen 9950X), all configurations get 53–55 GB/s.

pocl_standalone_jll 7.2.3+1 gives each PoCL thread a contiguous block of
a kernel's workgroups, so that a kernel touching memory first and a later
kernel with as many workgroups work on each part of an array from the
same thread, and makes POCL_AFFINITY=1 spread the threads over the NUMA
domains. Compat can't name a build, so require 7.2.3, which resolves to
the latest one.

The NUMA example's page said that it hadn't been measured on a system
with several memory domains. Explain the scheduling and the pinning, and
add measurements on 2x EPYC 7502: 242 GB/s with 64 pinned threads and
parallel initialization, against 142 with serial initialization and
130-155 without pinning; a 32-thread team gets 157 against 124.
@maleadt maleadt added the pocl The PoCL-based CPU back-end. label Oct 26, 2026
@maleadt
maleadt added this pull request to stack #929 October 26, 2026 13:25
@maleadt

maleadt commented Oct 26, 2026

Copy link
Copy Markdown
Member Author

Note that we'll have to re-do this when switching to ThreadTeams.jl, so I plan on getting this out quickly such that NUMA users have something to work with.

@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

Copy link
Copy Markdown
Contributor

Benchmark Results

Show table
main b2885db... main / b2885db...
const/@Const/Float32/262144 0.196 ± 0.0053 ms 0.195 ± 0.0049 ms 1.01 ± 0.037
const/@Const/Float32/65536 0.0476 ± 0.0045 ms 0.0466 ± 0.0043 ms 1.02 ± 0.14
const/@Const/Float64/262144 0.361 ± 0.011 ms 0.361 ± 0.0093 ms 1 ± 0.04
const/@Const/Float64/65536 0.107 ± 0.0044 ms 0.112 ± 0.0039 ms 0.953 ± 0.051
const/unmarked/Float32/262144 0.321 ± 0.012 ms 0.242 ± 0.0088 ms 1.32 ± 0.07
const/unmarked/Float32/65536 0.0827 ± 0.0039 ms 0.0824 ± 0.0028 ms 1 ± 0.059
const/unmarked/Float64/262144 0.447 ± 0.015 ms 0.451 ± 0.02 ms 0.992 ± 0.055
const/unmarked/Float64/65536 0.138 ± 0.0083 ms 0.139 ± 0.0083 ms 0.992 ± 0.084
dgsem/2D/Float32/fluxdiff/element 0.297 ± 0.012 ms 0.295 ± 0.0085 ms 1.01 ± 0.05
dgsem/2D/Float32/fluxdiff/node E=8 0.487 ± 0.0093 ms 0.482 ± 0.013 ms 1.01 ± 0.034
dgsem/2D/Float32/fluxdiff/node halfsweep E=8 0.304 ± 0.012 ms 0.306 ± 0.017 ms 0.993 ± 0.068
dgsem/2D/Float32/fluxdiff/node halfsweep v-last E=8 0.335 ± 0.011 ms 0.332 ± 0.011 ms 1.01 ± 0.048
dgsem/2D/Float32/weak/element 0.113 ± 0.018 ms 0.112 ± 0.016 ms 1.01 ± 0.22
dgsem/2D/Float32/weak/element private 0.252 ± 0.0094 ms 0.25 ± 0.0076 ms 1.01 ± 0.048
dgsem/2D/Float32/weak/node localmem E=1 0.101 ± 0.011 ms 0.101 ± 0.012 ms 1 ± 0.16
dgsem/2D/Float32/weak/node localmem E=8 0.0978 ± 0.0049 ms 0.0976 ± 0.0061 ms 1 ± 0.08
dgsem/2D/Float32/weak/node localmem v-last E=1 0.161 ± 0.0079 ms 0.16 ± 0.0088 ms 1.01 ± 0.074
dgsem/2D/Float32/weak/node localmem v-last E=8 0.159 ± 0.0082 ms 0.158 ± 0.0059 ms 1.01 ± 0.064
dgsem/2D/Float32/weak/node recompute E=8 0.28 ± 0.0083 ms 0.277 ± 0.0062 ms 1.01 ± 0.038
dgsem/2D/Float64/fluxdiff/element 0.307 ± 0.0097 ms 0.303 ± 0.011 ms 1.01 ± 0.048
dgsem/2D/Float64/fluxdiff/node E=8 0.518 ± 0.012 ms 0.516 ± 0.016 ms 1 ± 0.039
dgsem/2D/Float64/fluxdiff/node halfsweep E=8 0.319 ± 0.014 ms 0.311 ± 0.017 ms 1.02 ± 0.071
dgsem/2D/Float64/fluxdiff/node halfsweep v-last E=8 0.342 ± 0.01 ms 0.351 ± 0.016 ms 0.975 ± 0.053
dgsem/2D/Float64/weak/element 0.125 ± 0.0096 ms 0.116 ± 0.0042 ms 1.08 ± 0.091
dgsem/2D/Float64/weak/element private 0.25 ± 0.01 ms 0.262 ± 0.018 ms 0.953 ± 0.077
dgsem/2D/Float64/weak/node localmem E=1 0.104 ± 0.0039 ms 0.104 ± 0.0023 ms 0.997 ± 0.044
dgsem/2D/Float64/weak/node localmem E=8 0.104 ± 0.011 ms 0.104 ± 0.0098 ms 1 ± 0.14
dgsem/2D/Float64/weak/node localmem v-last E=1 0.159 ± 0.0093 ms 0.16 ± 0.0073 ms 0.996 ± 0.074
dgsem/2D/Float64/weak/node localmem v-last E=8 0.158 ± 0.0048 ms 0.158 ± 0.0035 ms 1 ± 0.038
dgsem/2D/Float64/weak/node recompute E=8 0.285 ± 0.0055 ms 0.286 ± 0.0072 ms 0.996 ± 0.032
dgsem/3D/Float32/fluxdiff/element 1 ± 0.033 ms 1.04 ± 0.02 ms 0.966 ± 0.037
dgsem/3D/Float32/fluxdiff/node E=2 1.81 ± 0.052 ms 1.89 ± 0.013 ms 0.961 ± 0.028
dgsem/3D/Float32/fluxdiff/node halfsweep E=1 0.935 ± 0.034 ms 0.943 ± 0.011 ms 0.991 ± 0.038
dgsem/3D/Float32/fluxdiff/node halfsweep v-last E=1 1.1 ± 0.032 ms 1.09 ± 0.054 ms 1 ± 0.058
dgsem/3D/Float32/weak/element 0.361 ± 0.0096 ms 0.367 ± 0.01 ms 0.984 ± 0.038
dgsem/3D/Float32/weak/element private 0.369 ± 0.019 ms 0.353 ± 0.011 ms 1.04 ± 0.063
dgsem/3D/Float32/weak/node localmem E=1 0.365 ± 0.0078 ms 0.37 ± 0.01 ms 0.987 ± 0.035
dgsem/3D/Float32/weak/node localmem E=2 0.531 ± 0.019 ms 0.541 ± 0.011 ms 0.982 ± 0.04
dgsem/3D/Float32/weak/node localmem v-last E=1 0.509 ± 0.018 ms 0.528 ± 0.013 ms 0.965 ± 0.04
dgsem/3D/Float32/weak/node localmem v-last E=2 0.712 ± 0.018 ms 0.677 ± 0.032 ms 1.05 ± 0.056
dgsem/3D/Float32/weak/node recompute E=2 1.05 ± 0.041 ms 1.03 ± 0.036 ms 1.02 ± 0.054
dgsem/3D/Float32/weak/slab E=1 0.474 ± 0.0085 ms 0.485 ± 0.023 ms 0.977 ± 0.049
dgsem/3D/Float32/weak/slab E=8 0.589 ± 0.021 ms 0.57 ± 0.02 ms 1.03 ± 0.052
dgsem/3D/Float32/weak/slab double-buffered E=1 0.488 ± 0.018 ms 0.491 ± 0.021 ms 0.993 ± 0.055
dgsem/3D/Float32/weak/slab double-buffered E=8 0.563 ± 0.015 ms 0.562 ± 0.01 ms 1 ± 0.032
dgsem/3D/Float32/weak/slab double-buffered v-last E=1 0.495 ± 0.011 ms 0.499 ± 0.012 ms 0.991 ± 0.031
dgsem/3D/Float32/weak/slab double-buffered v-last E=8 0.588 ± 0.017 ms 0.577 ± 0.018 ms 1.02 ± 0.044
dgsem/3D/Float32/weak/slab v-last E=1 0.497 ± 0.018 ms 0.507 ± 0.011 ms 0.98 ± 0.041
dgsem/3D/Float32/weak/slab v-last E=8 0.583 ± 0.012 ms 0.593 ± 0.017 ms 0.983 ± 0.034
dgsem/3D/Float64/fluxdiff/element 1.07 ± 0.027 ms 1.08 ± 0.02 ms 0.993 ± 0.031
dgsem/3D/Float64/fluxdiff/node E=2 2.02 ± 0.022 ms 1.99 ± 0.067 ms 1.02 ± 0.036
dgsem/3D/Float64/fluxdiff/node halfsweep E=1 0.968 ± 0.03 ms 0.995 ± 0.022 ms 0.973 ± 0.037
dgsem/3D/Float64/fluxdiff/node halfsweep v-last E=1 1.15 ± 0.018 ms 1.15 ± 0.0097 ms 1 ± 0.018
dgsem/3D/Float64/weak/element 0.381 ± 0.011 ms 0.371 ± 0.015 ms 1.03 ± 0.05
dgsem/3D/Float64/weak/element private 0.397 ± 0.013 ms 0.38 ± 0.016 ms 1.04 ± 0.055
dgsem/3D/Float64/weak/node localmem E=1 0.37 ± 0.011 ms 0.366 ± 0.012 ms 1.01 ± 0.044
dgsem/3D/Float64/weak/node localmem E=2 0.546 ± 0.024 ms 0.559 ± 0.019 ms 0.976 ± 0.054
dgsem/3D/Float64/weak/node localmem v-last E=1 0.528 ± 0.018 ms 0.532 ± 0.012 ms 0.994 ± 0.041
dgsem/3D/Float64/weak/node localmem v-last E=2 0.693 ± 0.0082 ms 0.706 ± 0.015 ms 0.981 ± 0.024
dgsem/3D/Float64/weak/node recompute E=2 1.11 ± 0.016 ms 1.12 ± 0.015 ms 0.988 ± 0.02
dgsem/3D/Float64/weak/slab E=1 0.492 ± 0.017 ms 0.52 ± 0.013 ms 0.948 ± 0.041
dgsem/3D/Float64/weak/slab E=8 0.737 ± 0.0069 ms 0.725 ± 0.023 ms 1.02 ± 0.034
dgsem/3D/Float64/weak/slab double-buffered E=1 0.513 ± 0.012 ms 0.505 ± 0.019 ms 1.02 ± 0.046
dgsem/3D/Float64/weak/slab double-buffered E=8 0.776 ± 0.016 ms 0.784 ± 0.019 ms 0.99 ± 0.031
dgsem/3D/Float64/weak/slab double-buffered v-last E=1 0.521 ± 0.019 ms 0.546 ± 0.014 ms 0.954 ± 0.043
dgsem/3D/Float64/weak/slab double-buffered v-last E=8 0.766 ± 0.028 ms 0.749 ± 0.023 ms 1.02 ± 0.049
dgsem/3D/Float64/weak/slab v-last E=1 0.509 ± 0.017 ms 0.524 ± 0.015 ms 0.97 ± 0.042
dgsem/3D/Float64/weak/slab v-last E=8 0.707 ± 0.0094 ms 0.688 ± 0.024 ms 1.03 ± 0.038
launch/3D static workgroup, dynamic ndrange 6.48 ± 1.1 μs 6.96 ± 1.3 μs 0.931 ± 0.24
launch/3D static workgroup, static ndrange 6.65 ± 0.88 μs 7 ± 0.92 μs 0.95 ± 0.18
launch/dynamic workgroup, dynamic ndrange 6.48 ± 0.98 μs 7.08 ± 1.1 μs 0.916 ± 0.2
launch/dynamic workgroup, dynamic ndrange, workgroupsize given 7.04 ± 1.1 μs 7.63 ± 0.97 μs 0.922 ± 0.18
launch/static workgroup, dynamic ndrange 6.11 ± 1.1 μs 6.71 ± 0.89 μs 0.911 ± 0.2
launch/static workgroup, static ndrange 6.51 ± 0.85 μs 6.69 ± 0.96 μs 0.974 ± 0.19
narrow workgroup/masked/W=16 0.272 ± 0.0088 ms 0.273 ± 0.0082 ms 0.997 ± 0.044
narrow workgroup/masked/W=4 0.271 ± 0.0087 ms 0.277 ± 0.0067 ms 0.977 ± 0.039
narrow workgroup/unmasked/W=16 0.278 ± 0.01 ms 0.281 ± 0.0078 ms 0.991 ± 0.046
narrow workgroup/unmasked/W=4 0.277 ± 0.0086 ms 0.268 ± 0.01 ms 1.03 ± 0.05
partition/dynamic workgroup, dynamic ndrange 0.0347 ± 0.015 μs 0.0345 ± 0.017 μs 1.01 ± 0.66
partition/static workgroup, dynamic ndrange 0.0414 ± 0.0084 μs 0.0418 ± 0.0086 μs 0.99 ± 0.29
partition/static workgroup, static ndrange 1.62 ± 0.011 ns 1.17 ± 0.01 ns 1.39 ± 0.015
saxpy/default/Float16/1024 7.89 ± 1.2 μs 8.49 ± 1.1 μs 0.93 ± 0.19
saxpy/default/Float16/1048576 0.145 ± 0.011 ms 0.145 ± 0.015 ms 0.995 ± 0.13
saxpy/default/Float16/16384 9.93 ± 1.5 μs 9.28 ± 1.3 μs 1.07 ± 0.22
saxpy/default/Float16/2048 8.34 ± 1.9 μs 8.18 ± 1.6 μs 1.02 ± 0.3
saxpy/default/Float16/256 8.29 ± 0.89 μs 8.44 ± 1.1 μs 0.981 ± 0.16
saxpy/default/Float16/262144 0.0384 ± 0.0025 ms 0.0409 ± 0.0043 ms 0.94 ± 0.12
saxpy/default/Float16/32768 13.2 ± 1 μs 14 ± 1.7 μs 0.943 ± 0.13
saxpy/default/Float16/4096 8.72 ± 1.2 μs 8.61 ± 1.1 μs 1.01 ± 0.19
saxpy/default/Float16/512 8 ± 1.2 μs 8.03 ± 1.5 μs 0.997 ± 0.24
saxpy/default/Float16/64 8.42 ± 0.86 μs 8.17 ± 1.2 μs 1.03 ± 0.18
saxpy/default/Float16/65536 16.6 ± 1.4 μs 17 ± 1.3 μs 0.973 ± 0.11
saxpy/default/Float32/1024 7.75 ± 1 μs 7.62 ± 1.2 μs 1.02 ± 0.21
saxpy/default/Float32/1048576 0.163 ± 0.023 ms 0.159 ± 0.012 ms 1.03 ± 0.16
saxpy/default/Float32/16384 9.42 ± 1.4 μs 8.51 ± 1.7 μs 1.11 ± 0.28
saxpy/default/Float32/2048 8.51 ± 1.3 μs 7.84 ± 1.4 μs 1.09 ± 0.26
saxpy/default/Float32/256 8.26 ± 1.1 μs 7.46 ± 1.3 μs 1.11 ± 0.24
saxpy/default/Float32/262144 0.0459 ± 0.0044 ms 0.0374 ± 0.0031 ms 1.23 ± 0.15
saxpy/default/Float32/32768 10.9 ± 2.1 μs 10.6 ± 2.7 μs 1.03 ± 0.33
saxpy/default/Float32/4096 8.7 ± 1.2 μs 9.4 ± 2.8 μs 0.925 ± 0.3
saxpy/default/Float32/512 7.88 ± 1.4 μs 7.76 ± 1 μs 1.02 ± 0.23
saxpy/default/Float32/64 8.23 ± 0.94 μs 8.03 ± 1 μs 1.03 ± 0.17
saxpy/default/Float32/65536 20.6 ± 7.7 μs 21 ± 7.6 μs 0.98 ± 0.51
saxpy/default/Float64/1024 8.45 ± 1.3 μs 8.33 ± 1.2 μs 1.01 ± 0.21
saxpy/default/Float64/1048576 0.339 ± 0.045 ms 0.321 ± 0.027 ms 1.05 ± 0.17
saxpy/default/Float64/16384 14.1 ± 1.3 μs 10.6 ± 2.2 μs 1.33 ± 0.29
saxpy/default/Float64/2048 9.31 ± 1 μs 8.64 ± 2 μs 1.08 ± 0.27
saxpy/default/Float64/256 7.51 ± 1 μs 7.99 ± 1 μs 0.939 ± 0.18
saxpy/default/Float64/262144 0.0989 ± 0.0089 ms 0.093 ± 0.0067 ms 1.06 ± 0.12
saxpy/default/Float64/32768 21.5 ± 7.2 μs 21.2 ± 8.2 μs 1.02 ± 0.52
saxpy/default/Float64/4096 10 ± 1.1 μs 9.18 ± 2.1 μs 1.09 ± 0.28
saxpy/default/Float64/512 8.29 ± 1.5 μs 8.69 ± 1.5 μs 0.954 ± 0.23
saxpy/default/Float64/64 8.76 ± 0.9 μs 8.22 ± 1 μs 1.07 ± 0.17
saxpy/default/Float64/65536 29.2 ± 5.9 μs 29.9 ± 6.1 μs 0.976 ± 0.28
saxpy/static workgroup=(1024,)/Float16/1024 7.58 ± 0.94 μs 7.97 ± 2.9 μs 0.951 ± 0.36
saxpy/static workgroup=(1024,)/Float16/1048576 0.148 ± 0.011 ms 0.14 ± 0.012 ms 1.06 ± 0.12
saxpy/static workgroup=(1024,)/Float16/16384 9.62 ± 1.3 μs 9.68 ± 1.1 μs 0.994 ± 0.18
saxpy/static workgroup=(1024,)/Float16/2048 8.07 ± 1.2 μs 7.72 ± 1.3 μs 1.05 ± 0.24
saxpy/static workgroup=(1024,)/Float16/256 8.96 ± 1.1 μs 8.84 ± 1.1 μs 1.01 ± 0.18
saxpy/static workgroup=(1024,)/Float16/262144 0.0405 ± 0.0052 ms 0.0406 ± 0.0047 ms 0.996 ± 0.17
saxpy/static workgroup=(1024,)/Float16/32768 13.9 ± 2 μs 13.6 ± 0.97 μs 1.02 ± 0.16
saxpy/static workgroup=(1024,)/Float16/4096 8.07 ± 1 μs 8.54 ± 1.5 μs 0.944 ± 0.21
saxpy/static workgroup=(1024,)/Float16/512 9 ± 0.98 μs 8.27 ± 1.5 μs 1.09 ± 0.23
saxpy/static workgroup=(1024,)/Float16/64 8.36 ± 1 μs 8.58 ± 0.93 μs 0.973 ± 0.16
saxpy/static workgroup=(1024,)/Float16/65536 17.3 ± 0.93 μs 16.7 ± 0.89 μs 1.04 ± 0.079
saxpy/static workgroup=(1024,)/Float32/1024 7.93 ± 1.1 μs 7.86 ± 1.2 μs 1.01 ± 0.21
saxpy/static workgroup=(1024,)/Float32/1048576 0.168 ± 0.023 ms 0.162 ± 0.016 ms 1.04 ± 0.18
saxpy/static workgroup=(1024,)/Float32/16384 9.32 ± 1.7 μs 8.86 ± 1.4 μs 1.05 ± 0.25
saxpy/static workgroup=(1024,)/Float32/2048 7.73 ± 1.1 μs 7.84 ± 1.4 μs 0.986 ± 0.22
saxpy/static workgroup=(1024,)/Float32/256 8.17 ± 1.3 μs 8.54 ± 1.1 μs 0.957 ± 0.19
saxpy/static workgroup=(1024,)/Float32/262144 0.0506 ± 0.0063 ms 0.0385 ± 0.0036 ms 1.31 ± 0.2
saxpy/static workgroup=(1024,)/Float32/32768 11.2 ± 2.8 μs 10.9 ± 2.6 μs 1.03 ± 0.36
saxpy/static workgroup=(1024,)/Float32/4096 8.16 ± 1.2 μs 8.16 ± 1.3 μs 1 ± 0.22
saxpy/static workgroup=(1024,)/Float32/512 7.58 ± 1.5 μs 7.96 ± 1.4 μs 0.952 ± 0.25
saxpy/static workgroup=(1024,)/Float32/64 8.69 ± 1.1 μs 8.08 ± 1.2 μs 1.08 ± 0.21
saxpy/static workgroup=(1024,)/Float32/65536 19.8 ± 1.7 μs 20.4 ± 4.1 μs 0.974 ± 0.21
saxpy/static workgroup=(1024,)/Float64/1024 7.98 ± 1.6 μs 7.83 ± 1.6 μs 1.02 ± 0.29
saxpy/static workgroup=(1024,)/Float64/1048576 0.334 ± 0.05 ms 0.324 ± 0.047 ms 1.03 ± 0.21
saxpy/static workgroup=(1024,)/Float64/16384 10.7 ± 1.7 μs 11.3 ± 2.1 μs 0.946 ± 0.23
saxpy/static workgroup=(1024,)/Float64/2048 8.15 ± 1.1 μs 8.56 ± 1.8 μs 0.952 ± 0.24
saxpy/static workgroup=(1024,)/Float64/256 7.31 ± 1.4 μs 7.9 ± 2.5 μs 0.925 ± 0.34
saxpy/static workgroup=(1024,)/Float64/262144 0.105 ± 0.0099 ms 0.092 ± 0.0065 ms 1.14 ± 0.13
saxpy/static workgroup=(1024,)/Float64/32768 20.9 ± 3.3 μs 21.6 ± 4.8 μs 0.965 ± 0.26
saxpy/static workgroup=(1024,)/Float64/4096 10.8 ± 2.5 μs 8.02 ± 1.1 μs 1.35 ± 0.36
saxpy/static workgroup=(1024,)/Float64/512 8.25 ± 2.7 μs 8.6 ± 5.6 μs 0.959 ± 0.7
saxpy/static workgroup=(1024,)/Float64/64 8.15 ± 0.98 μs 8.77 ± 1.2 μs 0.93 ± 0.17
saxpy/static workgroup=(1024,)/Float64/65536 30.8 ± 4.2 μs 30.8 ± 7.1 μs 1 ± 0.27
time_to_load 0.351 ± 0.0056 s 0.361 ± 0.011 s 0.974 ± 0.034
main b2885db... main / b2885db...
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.204 k allocs: 11.9 kB 0.984

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 merged commit 5dd8a01 into main Oct 26, 2026
50 of 51 checks passed
@maleadt
maleadt deleted the tb/pocl-numa-docs branch October 26, 2026 14:55
@codecov

codecov Bot commented Oct 26, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 83.13%. Comparing base (4ccb4f0) to head (b2885db).

Additional details and impacted files
@@                   Coverage Diff                   @@
##           tb/pocl-parallel-zeros     #928   +/-   ##
=======================================================
  Coverage                   83.13%   83.13%           
=======================================================
  Files                          31       31           
  Lines                        2568     2568           
=======================================================
  Hits                         2135     2135           
  Misses                        433      433           

☔ 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

pocl The PoCL-based CPU back-end.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant