Skip to content

DGSEM benchmarks: a local-memory layout per backend - #875

Merged
vchuravy merged 1 commit into
mainfrom
vc/dgsem-benchmarks-layout-switch
Oct 11, 2026
Merged

vchuravy merged 1 commit into
mainfrom
vc/dgsem-benchmarks-layout-switch

Conversation

@vchuravy

Copy link
Copy Markdown
Member

Stacked on #871 (← #870 ← #866). #874 (tiles) is stacked on this.

This turns the local-memory layout of the DGSEM benchmarks into a per-backend switch, following a prototype for Trixi.jl's 3D GPU kernels and the VIJFH / VIJHF data layouts of ClimaCore.jl. There the layout is a type parameter of the space, and the docstring gives the reason for the variable-index-last variant: it permits linear indexing and is faster for operators that touch one field at a time.

This adds 4 benchmarks per precision in 3D (the slab kernels in the other layout).

Correctness

I compared every variant with weak/element or fluxdiff/element in 2D and 3D (including a partially filled last workgroup), in Float32 and Float64. All 98 checks are within 100 eps on PoCL and on CUDA, with KA main; on CUDA with #864's tiles, all 108. The two layouts give exactly the same results for every kernel.

Timings

Minimum (and median) in µs, at the suite's mesh sizes. The default layout is listed first.

PoCL, 1 thread, Ryzen 9 5950X (load average about 8), default variable-first:

default (v-first) v-last v-last / default
2D F32 weak/node localmem E=1 115 160 1.39
2D F64 weak/node localmem E=8 121 198 1.64
3D F32 weak/node localmem E=1 444 601 1.35
3D F64 weak/node localmem E=2 588 736 1.25
2D F32 fluxdiff/node halfsweep E=8 369 393 1.06
2D F64 fluxdiff/node halfsweep E=8 382 432 1.13
3D F32 fluxdiff/node halfsweep E=1 1626 1402 0.86
3D F64 fluxdiff/node halfsweep E=1 1451 1484 1.02
3D F32 weak/slab E=1 / E=8 1853 / 3805 1834 / 4016 0.99 / 1.06
3D F32 weak/slab double-buffered E=1 / E=8 1104 / 1364 1091 / 1394 0.99 / 1.02
3D F64 weak/slab E=1 / E=8 1880 / 4302 1886 / 4225 1.00 / 0.98
3D F64 weak/slab double-buffered E=1 / E=8 1087 / 1432 1086 / 1417 1.00 / 0.99

CUDA, Quadro RTX 4000, CUDA.jl vc/ki-subgroup-ops with #864's KA. Nothing else was on the GPU at the start; two other processes had started by the end, which raised some 3D Float64 medians but not the minimums. Default variable-last:

default (v-last) v-first v-first / default
2D F32 weak/node localmem E=1 / E=8 183 / 141 177 / 142 0.97 / 1.00
2D F64 weak/node localmem E=1 / E=8 1048 / 535 1045 / 535 1.00 / 1.00
3D F32 / F64 weak/node localmem E=2 428 / 1842 429 / 1841 1.00 / 1.00
2D F32 fluxdiff/node halfsweep E=8 341 323 0.95
2D F64 fluxdiff/node halfsweep E=8 2477 2471 1.00
3D F32 / F64 fluxdiff/node halfsweep E=1 1032 / 8610 1053 / 8529 1.02 / 0.99
3D F32 weak/slab E=1 / E=8 455 / 435 456 / 447 1.00 / 1.03
3D F32 weak/slab double-buffered E=1 / E=8 433 / 439 434 / 440 1.00 / 1.00
3D F64 weak/slab E=8, double-buffered E=8 1864 / 1863 1852 / 1857 0.99 / 1.00
2D F32 / F64 weak/node localmem tile_barrier E=8 (#874) 143 / 539 143 / 540 1.00 / 1.00

Observations:

  • PoCL: the variable-first default is 25–64% faster in the local-memory weak form and 6–13% faster in the 2D half sweep. The slab kernels don't depend on the layout (within 6%). The exception is the 3D Float32 half sweep, where variable-last is 14% faster.
  • CUDA: within ±5% everywhere in these kernels, at N = 4 with 4 or 5 variables. The bank conflicts that cost Trixi's 2D half sweep 2× (2D GPU volume kernels: local memory with the variable index last trixi-framework/Trixi.jl#3337) don't appear here (see DGSEM benchmarks: local-memory layout with the variable index last #871). In the 2D Float32 half sweep, earlier runs had variable-last 3–10% faster, so this row is within run-to-run noise.
  • So the switch is what the CPU backend needs, and costs nothing on CUDA for these kernels. The Trixi prototype measured the same on its 3D flux differencing kernels: on CUDA variable-last is up to 1.33× faster for FluxTurbo in Float32 (7 auxiliary values) and otherwise within 7%; on PoCL the layouts are within 5%.

🤖 Generated with Claude Code

@vchuravy
vchuravy added this pull request to stack #873 October 11, 2026 12:20
@codecov

codecov Bot commented Oct 11, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 80.49%. Comparing base (a3b50eb) to head (ade3afa).
⚠️ Report is 4 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##            main     #875       +/-   ##
==========================================
+ Coverage   1.96%   80.49%   +78.52%     
==========================================
  Files         24       26        +2     
  Lines       1980     2210      +230     
==========================================
+ Hits          39     1779     +1740     
+ Misses      1941      431     -1510     

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

@github-actions

github-actions Bot commented Oct 11, 2026 •

Copy link
Copy Markdown
Contributor

Benchmark Results

Show table
main ade3afa... main / ade3afa...
const/@Const/Float32/262144 0.311 ± 0.024 ms 0.302 ± 0.023 ms 1.03 ± 0.11
const/@Const/Float32/65536 0.105 ± 0.015 ms 0.0989 ± 0.0089 ms 1.07 ± 0.18
const/@Const/Float64/262144 0.524 ± 0.042 ms 0.512 ± 0.047 ms 1.02 ± 0.12
const/@Const/Float64/65536 0.234 ± 0.017 ms 0.233 ± 0.017 ms 1.01 ± 0.1
const/unmarked/Float32/262144 0.566 ± 0.036 ms 0.561 ± 0.035 ms 1.01 ± 0.091
const/unmarked/Float32/65536 0.174 ± 0.016 ms 0.171 ± 0.018 ms 1.02 ± 0.14
const/unmarked/Float64/262144 1.03 ± 0.064 ms 1.03 ± 0.082 ms 0.999 ± 0.1
const/unmarked/Float64/65536 0.356 ± 0.021 ms 0.352 ± 0.021 ms 1.01 ± 0.086
dgsem/2D/Float32/fluxdiff/element 0.452 ± 0.025 ms 0.444 ± 0.039 ms 1.02 ± 0.11
dgsem/2D/Float32/fluxdiff/node E=8 0.594 ± 0.026 ms 0.591 ± 0.023 ms 1.01 ± 0.058
dgsem/2D/Float32/fluxdiff/node halfsweep E=8 0.502 ± 0.023 ms 0.496 ± 0.015 ms 1.01 ± 0.056
dgsem/2D/Float32/fluxdiff/node halfsweep v-last E=8 0.524 ± 0.027 ms 0.52 ± 0.047 ms 1.01 ± 0.1
dgsem/2D/Float32/weak/element 0.164 ± 0.019 ms 0.158 ± 0.013 ms 1.03 ± 0.15
dgsem/2D/Float32/weak/element private 0.164 ± 0.017 ms 0.17 ± 0.016 ms 0.96 ± 0.13
dgsem/2D/Float32/weak/node localmem E=1 0.18 ± 0.017 ms 0.174 ± 0.0096 ms 1.03 ± 0.11
dgsem/2D/Float32/weak/node localmem E=8 0.177 ± 0.015 ms 0.182 ± 0.016 ms 0.969 ± 0.12
dgsem/2D/Float32/weak/node localmem v-last E=1 0.234 ± 0.019 ms 0.229 ± 0.018 ms 1.02 ± 0.11
dgsem/2D/Float32/weak/node localmem v-last E=8 0.24 ± 0.018 ms 0.235 ± 0.016 ms 1.02 ± 0.1
dgsem/2D/Float32/weak/node recompute E=8 0.399 ± 0.017 ms 0.406 ± 0.019 ms 0.983 ± 0.062
dgsem/2D/Float64/fluxdiff/element 0.648 ± 0.02 ms 0.65 ± 0.024 ms 0.997 ± 0.048
dgsem/2D/Float64/fluxdiff/node E=8 0.659 ± 0.04 ms 0.652 ± 0.034 ms 1.01 ± 0.082
dgsem/2D/Float64/fluxdiff/node halfsweep E=8 0.513 ± 0.027 ms 0.515 ± 0.03 ms 0.995 ± 0.077
dgsem/2D/Float64/fluxdiff/node halfsweep v-last E=8 0.544 ± 0.024 ms 0.529 ± 0.019 ms 1.03 ± 0.059
dgsem/2D/Float64/weak/element 0.217 ± 0.02 ms 0.216 ± 0.019 ms 1 ± 0.13
dgsem/2D/Float64/weak/element private 0.197 ± 0.019 ms 0.204 ± 0.019 ms 0.967 ± 0.13
dgsem/2D/Float64/weak/node localmem E=1 0.19 ± 0.019 ms 0.206 ± 0.022 ms 0.923 ± 0.14
dgsem/2D/Float64/weak/node localmem E=8 0.204 ± 0.019 ms 0.214 ± 0.024 ms 0.955 ± 0.14
dgsem/2D/Float64/weak/node localmem v-last E=1 0.269 ± 0.019 ms 0.266 ± 0.022 ms 1.01 ± 0.11
dgsem/2D/Float64/weak/node localmem v-last E=8 0.266 ± 0.021 ms 0.268 ± 0.026 ms 0.994 ± 0.13
dgsem/2D/Float64/weak/node recompute E=8 0.517 ± 0.025 ms 0.52 ± 0.031 ms 0.995 ± 0.076
dgsem/3D/Float32/fluxdiff/element 1.55 ± 0.065 ms 1.56 ± 0.091 ms 0.988 ± 0.071
dgsem/3D/Float32/fluxdiff/node E=2 2.52 ± 0.13 ms 2.5 ± 0.064 ms 1.01 ± 0.056
dgsem/3D/Float32/fluxdiff/node halfsweep E=1 1.69 ± 0.12 ms 1.69 ± 0.13 ms 0.999 ± 0.1
dgsem/3D/Float32/fluxdiff/node halfsweep v-last E=1 1.78 ± 0.1 ms 1.81 ± 0.17 ms 0.98 ± 0.11
dgsem/3D/Float32/weak/element 0.563 ± 0.024 ms 0.557 ± 0.042 ms 1.01 ± 0.087
dgsem/3D/Float32/weak/element private 0.549 ± 0.041 ms 0.554 ± 0.037 ms 0.991 ± 0.099
dgsem/3D/Float32/weak/node localmem E=1 0.626 ± 0.035 ms 0.617 ± 0.023 ms 1.01 ± 0.068
dgsem/3D/Float32/weak/node localmem E=2 0.665 ± 0.031 ms 0.665 ± 0.039 ms 0.999 ± 0.075
dgsem/3D/Float32/weak/node localmem v-last E=1 0.774 ± 0.055 ms 0.791 ± 0.044 ms 0.978 ± 0.089
dgsem/3D/Float32/weak/node localmem v-last E=2 0.796 ± 0.059 ms 0.802 ± 0.07 ms 0.992 ± 0.11
dgsem/3D/Float32/weak/node recompute E=2 1.82 ± 0.097 ms 1.82 ± 0.093 ms 1 ± 0.074
dgsem/3D/Float32/weak/slab E=1 1.93 ± 0.16 ms 2.1 ± 0.11 ms 0.923 ± 0.09
dgsem/3D/Float32/weak/slab E=8 3.64 ± 0.072 ms 3.65 ± 0.048 ms 0.996 ± 0.024
dgsem/3D/Float32/weak/slab double-buffered E=1 1.28 ± 0.11 ms 1.26 ± 0.09 ms 1.01 ± 0.11
dgsem/3D/Float32/weak/slab double-buffered E=8 1.43 ± 0.089 ms 1.44 ± 0.12 ms 0.994 ± 0.11
dgsem/3D/Float32/weak/slab double-buffered v-last E=1 1.24 ± 0.056 ms 1.24 ± 0.027 ms 0.999 ± 0.05
dgsem/3D/Float32/weak/slab double-buffered v-last E=8 1.41 ± 0.038 ms 1.45 ± 0.17 ms 0.972 ± 0.12
dgsem/3D/Float32/weak/slab v-last E=1 1.91 ± 0.13 ms 1.96 ± 0.14 ms 0.976 ± 0.098
dgsem/3D/Float32/weak/slab v-last E=8 3.52 ± 0.13 ms 3.55 ± 0.27 ms 0.99 ± 0.083
dgsem/3D/Float64/fluxdiff/element 1.64 ± 0.1 ms 1.62 ± 0.047 ms 1.01 ± 0.071
dgsem/3D/Float64/fluxdiff/node E=2 2.55 ± 0.088 ms 2.57 ± 0.12 ms 0.991 ± 0.059
dgsem/3D/Float64/fluxdiff/node halfsweep E=1 1.73 ± 0.1 ms 1.74 ± 0.061 ms 0.995 ± 0.067
dgsem/3D/Float64/fluxdiff/node halfsweep v-last E=1 1.93 ± 0.22 ms 1.85 ± 0.099 ms 1.04 ± 0.13
dgsem/3D/Float64/weak/element 0.665 ± 0.03 ms 0.669 ± 0.049 ms 0.995 ± 0.085
dgsem/3D/Float64/weak/element private 0.662 ± 0.046 ms 0.684 ± 0.053 ms 0.969 ± 0.1
dgsem/3D/Float64/weak/node localmem E=1 0.664 ± 0.042 ms 0.654 ± 0.032 ms 1.02 ± 0.081
dgsem/3D/Float64/weak/node localmem E=2 0.689 ± 0.025 ms 0.691 ± 0.048 ms 0.998 ± 0.078
dgsem/3D/Float64/weak/node localmem v-last E=1 0.8 ± 0.03 ms 0.817 ± 0.053 ms 0.979 ± 0.073
dgsem/3D/Float64/weak/node localmem v-last E=2 0.82 ± 0.048 ms 0.85 ± 0.086 ms 0.965 ± 0.11
dgsem/3D/Float64/weak/node recompute E=2 1.98 ± 0.14 ms 1.95 ± 0.1 ms 1.01 ± 0.088
dgsem/3D/Float64/weak/slab E=1 1.99 ± 0.1 ms 1.97 ± 0.2 ms 1.01 ± 0.11
dgsem/3D/Float64/weak/slab E=8 3.79 ± 0.35 ms 4.23 ± 0.34 ms 0.896 ± 0.11
dgsem/3D/Float64/weak/slab double-buffered E=1 1.32 ± 0.16 ms 1.29 ± 0.065 ms 1.02 ± 0.14
dgsem/3D/Float64/weak/slab double-buffered E=8 1.56 ± 0.081 ms 1.49 ± 0.043 ms 1.05 ± 0.062
dgsem/3D/Float64/weak/slab double-buffered v-last E=1 1.28 ± 0.047 ms 1.31 ± 0.087 ms 0.978 ± 0.074
dgsem/3D/Float64/weak/slab double-buffered v-last E=8 1.53 ± 0.07 ms 1.53 ± 0.12 ms 0.997 ± 0.089
dgsem/3D/Float64/weak/slab v-last E=1 2.09 ± 0.16 ms 2.03 ± 0.069 ms 1.03 ± 0.085
dgsem/3D/Float64/weak/slab v-last E=8 3.7 ± 0.068 ms 3.8 ± 0.29 ms 0.975 ± 0.076
launch/3D static workgroup, dynamic ndrange 15.5 ± 3.8 μs 16 ± 2.8 μs 0.97 ± 0.29
launch/3D static workgroup, static ndrange 16.2 ± 13 μs 16.7 ± 2.7 μs 0.973 ± 0.79
launch/dynamic workgroup, dynamic ndrange 15 ± 2.5 μs 15.8 ± 3.2 μs 0.952 ± 0.25
launch/dynamic workgroup, dynamic ndrange, workgroupsize given 17.4 ± 2 μs 16.5 ± 2.4 μs 1.05 ± 0.2
launch/static workgroup, dynamic ndrange 15.2 ± 2.7 μs 14.8 ± 2.5 μs 1.02 ± 0.25
launch/static workgroup, static ndrange 15.5 ± 2.2 μs 16.6 ± 2.3 μs 0.935 ± 0.19
partition/dynamic workgroup, dynamic ndrange 0.0484 ± 0.018 μs 0.0581 ± 0.016 μs 0.833 ± 0.38
partition/static workgroup, dynamic ndrange 0.0522 ± 0.0096 μs 0.0567 ± 0.012 μs 0.922 ± 0.26
partition/static workgroup, static ndrange 1.13 ± 0.006 ns 1.13 ± 0.028 ns 0.998 ± 0.025
saxpy/default/Float16/1024 17.1 ± 2.6 μs 15.5 ± 2 μs 1.1 ± 0.22
saxpy/default/Float16/1048576 0.499 ± 0.051 ms 0.522 ± 0.11 ms 0.956 ± 0.22
saxpy/default/Float16/16384 31.4 ± 11 μs 23.9 ± 14 μs 1.32 ± 0.9
saxpy/default/Float16/2048 18 ± 3 μs 18.5 ± 14 μs 0.968 ± 0.76
saxpy/default/Float16/256 17.1 ± 3 μs 15.6 ± 1.4 μs 1.1 ± 0.22
saxpy/default/Float16/262144 0.16 ± 0.039 ms 0.163 ± 0.038 ms 0.983 ± 0.33
saxpy/default/Float16/32768 0.0391 ± 0.0058 ms 24.1 ± 7.5 μs 1.62 ± 0.56
saxpy/default/Float16/4096 18.8 ± 14 μs 16.2 ± 1.7 μs 1.16 ± 0.85
saxpy/default/Float16/512 17.3 ± 2 μs 17 ± 2.5 μs 1.02 ± 0.19
saxpy/default/Float16/64 18.1 ± 18 μs 16 ± 2.8 μs 1.13 ± 1.1
saxpy/default/Float16/65536 0.0422 ± 0.017 ms 0.0426 ± 0.014 ms 0.992 ± 0.51
saxpy/default/Float32/1024 17.1 ± 2.5 μs 15.3 ± 1.4 μs 1.12 ± 0.2
saxpy/default/Float32/1048576 0.664 ± 0.088 ms 0.632 ± 0.087 ms 1.05 ± 0.2
saxpy/default/Float32/16384 16.4 ± 4.3 μs 0.0347 ± 0.0041 ms 0.473 ± 0.14
saxpy/default/Float32/2048 13.8 ± 1.8 μs 14.5 ± 3.6 μs 0.955 ± 0.27
saxpy/default/Float32/256 18.1 ± 3 μs 17.7 ± 2.6 μs 1.02 ± 0.23
saxpy/default/Float32/262144 0.218 ± 0.04 ms 0.222 ± 0.052 ms 0.984 ± 0.3
saxpy/default/Float32/32768 22.3 ± 21 μs 22.4 ± 21 μs 0.996 ± 1.3
saxpy/default/Float32/4096 18.5 ± 4.5 μs 15.5 ± 2.8 μs 1.2 ± 0.36
saxpy/default/Float32/512 15.7 ± 2.4 μs 14 ± 1.7 μs 1.13 ± 0.22
saxpy/default/Float32/64 16.6 ± 2.4 μs 17.1 ± 2.9 μs 0.971 ± 0.22
saxpy/default/Float32/65536 0.044 ± 0.024 ms 0.0378 ± 0.02 ms 1.16 ± 0.87
saxpy/default/Float64/1024 18.1 ± 11 μs 17 ± 2.3 μs 1.06 ± 0.67
saxpy/default/Float64/1048576 1.36 ± 0.11 ms 1.35 ± 0.13 ms 1 ± 0.13
saxpy/default/Float64/16384 21.3 ± 22 μs 0.0414 ± 0.0082 ms 0.514 ± 0.55
saxpy/default/Float64/2048 20.1 ± 12 μs 17.1 ± 4 μs 1.17 ± 0.78
saxpy/default/Float64/256 17.1 ± 14 μs 15.5 ± 2.4 μs 1.1 ± 0.92
saxpy/default/Float64/262144 0.363 ± 0.068 ms 0.363 ± 0.078 ms 1 ± 0.29
saxpy/default/Float64/32768 0.0498 ± 0.022 ms 0.0419 ± 0.02 ms 1.19 ± 0.77
saxpy/default/Float64/4096 31 ± 3.4 μs 21.9 ± 17 μs 1.41 ± 1.1
saxpy/default/Float64/512 17.9 ± 4.3 μs 15.2 ± 2.9 μs 1.18 ± 0.36
saxpy/default/Float64/64 16.2 ± 2.2 μs 17.4 ± 18 μs 0.935 ± 0.98
saxpy/default/Float64/65536 0.119 ± 0.022 ms 0.119 ± 0.021 ms 1 ± 0.26
saxpy/static workgroup=(1024,)/Float16/1024 17.5 ± 2.8 μs 15.5 ± 1.6 μs 1.13 ± 0.22
saxpy/static workgroup=(1024,)/Float16/1048576 0.503 ± 0.056 ms 0.514 ± 0.11 ms 0.978 ± 0.24
saxpy/static workgroup=(1024,)/Float16/16384 25.5 ± 11 μs 0.0335 ± 0.0083 ms 0.762 ± 0.37
saxpy/static workgroup=(1024,)/Float16/2048 17.1 ± 2.2 μs 16.1 ± 2.8 μs 1.06 ± 0.23
saxpy/static workgroup=(1024,)/Float16/256 14.9 ± 2 μs 15.5 ± 1.3 μs 0.963 ± 0.15
saxpy/static workgroup=(1024,)/Float16/262144 0.158 ± 0.034 ms 0.167 ± 0.045 ms 0.95 ± 0.33
saxpy/static workgroup=(1024,)/Float16/32768 0.0383 ± 0.016 ms 28.9 ± 7.6 μs 1.32 ± 0.65
saxpy/static workgroup=(1024,)/Float16/4096 18.3 ± 3.5 μs 17.8 ± 2.9 μs 1.03 ± 0.26
saxpy/static workgroup=(1024,)/Float16/512 17.5 ± 8.4 μs 17 ± 5.8 μs 1.03 ± 0.61
saxpy/static workgroup=(1024,)/Float16/64 18.6 ± 4.1 μs 14.5 ± 2.3 μs 1.28 ± 0.35
saxpy/static workgroup=(1024,)/Float16/65536 0.042 ± 0.015 ms 0.046 ± 0.016 ms 0.913 ± 0.44
saxpy/static workgroup=(1024,)/Float32/1024 15.2 ± 3.5 μs 16.7 ± 2.8 μs 0.907 ± 0.26
saxpy/static workgroup=(1024,)/Float32/1048576 0.672 ± 0.074 ms 0.672 ± 0.074 ms 1 ± 0.16
saxpy/static workgroup=(1024,)/Float32/16384 17.3 ± 3.1 μs 0.034 ± 0.011 ms 0.509 ± 0.19
saxpy/static workgroup=(1024,)/Float32/2048 14.1 ± 2.5 μs 16.7 ± 2.7 μs 0.841 ± 0.2
saxpy/static workgroup=(1024,)/Float32/256 17.6 ± 6.9 μs 18.4 ± 3.2 μs 0.953 ± 0.41
saxpy/static workgroup=(1024,)/Float32/262144 0.218 ± 0.049 ms 0.219 ± 0.038 ms 0.999 ± 0.28
saxpy/static workgroup=(1024,)/Float32/32768 20 ± 18 μs 0.0326 ± 0.023 ms 0.614 ± 0.69
saxpy/static workgroup=(1024,)/Float32/4096 20.8 ± 11 μs 14 ± 2.7 μs 1.48 ± 0.84
saxpy/static workgroup=(1024,)/Float32/512 16.8 ± 2.6 μs 15.9 ± 3.5 μs 1.06 ± 0.28
saxpy/static workgroup=(1024,)/Float32/64 17.8 ± 3.7 μs 17.9 ± 5.3 μs 0.994 ± 0.36
saxpy/static workgroup=(1024,)/Float32/65536 0.0445 ± 0.024 ms 0.0391 ± 0.022 ms 1.14 ± 0.89
saxpy/static workgroup=(1024,)/Float64/1024 18.7 ± 8.6 μs 16.9 ± 2.7 μs 1.1 ± 0.54
saxpy/static workgroup=(1024,)/Float64/1048576 1.34 ± 0.092 ms 1.31 ± 0.11 ms 1.02 ± 0.11
saxpy/static workgroup=(1024,)/Float64/16384 0.0333 ± 0.022 ms 31.2 ± 21 μs 1.07 ± 1
saxpy/static workgroup=(1024,)/Float64/2048 18 ± 8.8 μs 17.4 ± 15 μs 1.04 ± 1
saxpy/static workgroup=(1024,)/Float64/256 17.4 ± 3.2 μs 15.6 ± 2.3 μs 1.11 ± 0.26
saxpy/static workgroup=(1024,)/Float64/262144 0.366 ± 0.069 ms 0.366 ± 0.071 ms 1 ± 0.27
saxpy/static workgroup=(1024,)/Float64/32768 0.0513 ± 0.02 ms 0.0351 ± 0.015 ms 1.46 ± 0.86
saxpy/static workgroup=(1024,)/Float64/4096 30.4 ± 17 μs 22.1 ± 18 μs 1.38 ± 1.3
saxpy/static workgroup=(1024,)/Float64/512 16.6 ± 2.8 μs 15.6 ± 2.3 μs 1.07 ± 0.24
saxpy/static workgroup=(1024,)/Float64/64 16.9 ± 2.7 μs 17.5 ± 3.2 μs 0.965 ± 0.23
saxpy/static workgroup=(1024,)/Float64/65536 0.118 ± 0.021 ms 0.122 ± 0.027 ms 0.97 ± 0.28
time_to_load 0.468 ± 0.011 s 0.483 ± 0.024 s 0.969 ± 0.054
main ade3afa... main / ade3afa...
const/@Const/Float32/262144 9 allocs: 0.203 kB 9 allocs: 0.203 kB 1
const/@Const/Float32/65536 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
const/@Const/Float64/262144 9 allocs: 0.203 kB 9 allocs: 0.203 kB 1
const/@Const/Float64/65536 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
const/unmarked/Float32/262144 9 allocs: 0.203 kB 9 allocs: 0.203 kB 1
const/unmarked/Float32/65536 9 allocs: 0.203 kB 9 allocs: 0.203 kB 1
const/unmarked/Float64/262144 9 allocs: 0.203 kB 9 allocs: 0.203 kB 1
const/unmarked/Float64/65536 9 allocs: 0.203 kB 9 allocs: 0.203 kB 1
dgsem/2D/Float32/fluxdiff/element 10 allocs: 0.219 kB 10 allocs: 0.219 kB 1
dgsem/2D/Float32/fluxdiff/node E=8 10 allocs: 0.234 kB 10 allocs: 0.234 kB 1
dgsem/2D/Float32/fluxdiff/node halfsweep E=8 10 allocs: 0.234 kB 10 allocs: 0.234 kB 1
dgsem/2D/Float32/fluxdiff/node halfsweep v-last E=8 10 allocs: 0.234 kB 6 allocs: 0.125 kB 1.88
dgsem/2D/Float32/weak/element 10 allocs: 0.219 kB 10 allocs: 0.219 kB 1
dgsem/2D/Float32/weak/element private 10 allocs: 0.219 kB 6 allocs: 0.109 kB 2
dgsem/2D/Float32/weak/node localmem E=1 10 allocs: 0.234 kB 10 allocs: 0.234 kB 1
dgsem/2D/Float32/weak/node localmem E=8 10 allocs: 0.234 kB 6 allocs: 0.125 kB 1.88
dgsem/2D/Float32/weak/node localmem v-last E=1 10 allocs: 0.234 kB 10 allocs: 0.234 kB 1
dgsem/2D/Float32/weak/node localmem v-last E=8 10 allocs: 0.234 kB 10 allocs: 0.234 kB 1
dgsem/2D/Float32/weak/node recompute E=8 10 allocs: 0.234 kB 10 allocs: 0.234 kB 1
dgsem/2D/Float64/fluxdiff/element 10 allocs: 0.219 kB 10 allocs: 0.219 kB 1
dgsem/2D/Float64/fluxdiff/node E=8 10 allocs: 0.234 kB 10 allocs: 0.234 kB 1
dgsem/2D/Float64/fluxdiff/node halfsweep E=8 10 allocs: 0.234 kB 10 allocs: 0.234 kB 1
dgsem/2D/Float64/fluxdiff/node halfsweep v-last E=8 10 allocs: 0.234 kB 10 allocs: 0.234 kB 1
dgsem/2D/Float64/weak/element 10 allocs: 0.219 kB 6 allocs: 0.109 kB 2
dgsem/2D/Float64/weak/element private 10 allocs: 0.219 kB 10 allocs: 0.219 kB 1
dgsem/2D/Float64/weak/node localmem E=1 10 allocs: 0.234 kB 10 allocs: 0.234 kB 1
dgsem/2D/Float64/weak/node localmem E=8 10 allocs: 0.234 kB 10 allocs: 0.234 kB 1
dgsem/2D/Float64/weak/node localmem v-last E=1 10 allocs: 0.234 kB 10 allocs: 0.234 kB 1
dgsem/2D/Float64/weak/node localmem v-last E=8 6 allocs: 0.125 kB 6 allocs: 0.125 kB 1
dgsem/2D/Float64/weak/node recompute E=8 10 allocs: 0.234 kB 10 allocs: 0.234 kB 1
dgsem/3D/Float32/fluxdiff/element 10 allocs: 0.219 kB 10 allocs: 0.219 kB 1
dgsem/3D/Float32/fluxdiff/node E=2 13 allocs: 0.391 kB 13 allocs: 0.391 kB 1
dgsem/3D/Float32/fluxdiff/node halfsweep E=1 13 allocs: 0.391 kB 13 allocs: 0.391 kB 1
dgsem/3D/Float32/fluxdiff/node halfsweep v-last E=1 13 allocs: 0.391 kB 13 allocs: 0.391 kB 1
dgsem/3D/Float32/weak/element 10 allocs: 0.219 kB 10 allocs: 0.219 kB 1
dgsem/3D/Float32/weak/element private 10 allocs: 0.219 kB 10 allocs: 0.219 kB 1
dgsem/3D/Float32/weak/node localmem E=1 13 allocs: 0.391 kB 13 allocs: 0.391 kB 1
dgsem/3D/Float32/weak/node localmem E=2 13 allocs: 0.391 kB 13 allocs: 0.391 kB 1
dgsem/3D/Float32/weak/node localmem v-last E=1 13 allocs: 0.391 kB 13 allocs: 0.391 kB 1
dgsem/3D/Float32/weak/node localmem v-last E=2 13 allocs: 0.391 kB 13 allocs: 0.391 kB 1
dgsem/3D/Float32/weak/node recompute E=2 13 allocs: 0.391 kB 13 allocs: 0.391 kB 1
dgsem/3D/Float32/weak/slab E=1 10 allocs: 0.234 kB 10 allocs: 0.234 kB 1
dgsem/3D/Float32/weak/slab E=8 10 allocs: 0.234 kB 10 allocs: 0.234 kB 1
dgsem/3D/Float32/weak/slab double-buffered E=1 10 allocs: 0.234 kB 10 allocs: 0.234 kB 1
dgsem/3D/Float32/weak/slab double-buffered E=8 10 allocs: 0.234 kB 10 allocs: 0.234 kB 1
dgsem/3D/Float32/weak/slab double-buffered v-last E=1 10 allocs: 0.234 kB 10 allocs: 0.234 kB 1
dgsem/3D/Float32/weak/slab double-buffered v-last E=8 10 allocs: 0.234 kB 10 allocs: 0.234 kB 1
dgsem/3D/Float32/weak/slab v-last E=1 10 allocs: 0.234 kB 10 allocs: 0.234 kB 1
dgsem/3D/Float32/weak/slab v-last E=8 10 allocs: 0.234 kB 10 allocs: 0.234 kB 1
dgsem/3D/Float64/fluxdiff/element 10 allocs: 0.219 kB 10 allocs: 0.219 kB 1
dgsem/3D/Float64/fluxdiff/node E=2 13 allocs: 0.391 kB 13 allocs: 0.391 kB 1
dgsem/3D/Float64/fluxdiff/node halfsweep E=1 13 allocs: 0.391 kB 13 allocs: 0.391 kB 1
dgsem/3D/Float64/fluxdiff/node halfsweep v-last E=1 13 allocs: 0.391 kB 13 allocs: 0.391 kB 1
dgsem/3D/Float64/weak/element 10 allocs: 0.219 kB 10 allocs: 0.219 kB 1
dgsem/3D/Float64/weak/element private 10 allocs: 0.219 kB 10 allocs: 0.219 kB 1
dgsem/3D/Float64/weak/node localmem E=1 13 allocs: 0.391 kB 13 allocs: 0.391 kB 1
dgsem/3D/Float64/weak/node localmem E=2 13 allocs: 0.391 kB 13 allocs: 0.391 kB 1
dgsem/3D/Float64/weak/node localmem v-last E=1 13 allocs: 0.391 kB 13 allocs: 0.391 kB 1
dgsem/3D/Float64/weak/node localmem v-last E=2 13 allocs: 0.391 kB 13 allocs: 0.391 kB 1
dgsem/3D/Float64/weak/node recompute E=2 13 allocs: 0.391 kB 13 allocs: 0.391 kB 1
dgsem/3D/Float64/weak/slab E=1 10 allocs: 0.234 kB 10 allocs: 0.234 kB 1
dgsem/3D/Float64/weak/slab E=8 10 allocs: 0.234 kB 10 allocs: 0.234 kB 1
dgsem/3D/Float64/weak/slab double-buffered E=1 10 allocs: 0.234 kB 10 allocs: 0.234 kB 1
dgsem/3D/Float64/weak/slab double-buffered E=8 10 allocs: 0.234 kB 10 allocs: 0.234 kB 1
dgsem/3D/Float64/weak/slab double-buffered v-last E=1 10 allocs: 0.234 kB 10 allocs: 0.234 kB 1
dgsem/3D/Float64/weak/slab double-buffered v-last E=8 10 allocs: 0.234 kB 10 allocs: 0.234 kB 1
dgsem/3D/Float64/weak/slab v-last E=1 10 allocs: 0.234 kB 10 allocs: 0.234 kB 1
dgsem/3D/Float64/weak/slab v-last E=8 10 allocs: 0.234 kB 10 allocs: 0.234 kB 1
launch/3D static workgroup, dynamic ndrange 9 allocs: 0.219 kB 9 allocs: 0.219 kB 1
launch/3D static workgroup, static ndrange 9 allocs: 0.219 kB 9 allocs: 0.219 kB 1
launch/dynamic workgroup, dynamic ndrange 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
launch/dynamic workgroup, dynamic ndrange, workgroupsize given 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
launch/static workgroup, dynamic ndrange 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
launch/static workgroup, static ndrange 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
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 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float16/1048576 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/default/Float16/16384 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float16/2048 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float16/256 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/default/Float16/262144 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/default/Float16/32768 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float16/4096 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float16/512 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float16/64 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/default/Float16/65536 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float32/1024 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float32/1048576 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/default/Float32/16384 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float32/2048 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float32/256 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/default/Float32/262144 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/default/Float32/32768 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float32/4096 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float32/512 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float32/64 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/default/Float32/65536 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float64/1024 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float64/1048576 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/default/Float64/16384 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float64/2048 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float64/256 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/default/Float64/262144 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/default/Float64/32768 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float64/4096 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float64/512 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float64/64 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/default/Float64/65536 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float16/1024 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float16/1048576 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/static workgroup=(1024,)/Float16/16384 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float16/2048 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float16/256 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/static workgroup=(1024,)/Float16/262144 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/static workgroup=(1024,)/Float16/32768 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float16/4096 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float16/512 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float16/64 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/static workgroup=(1024,)/Float16/65536 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float32/1024 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float32/1048576 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/static workgroup=(1024,)/Float32/16384 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float32/2048 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float32/256 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/static workgroup=(1024,)/Float32/262144 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/static workgroup=(1024,)/Float32/32768 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float32/4096 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float32/512 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float32/64 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/static workgroup=(1024,)/Float32/65536 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float64/1024 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float64/1048576 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/static workgroup=(1024,)/Float64/16384 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float64/2048 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float64/256 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/static workgroup=(1024,)/Float64/262144 8 allocs: 0.141 kB 12 allocs: 0.25 kB 0.562
saxpy/static workgroup=(1024,)/Float64/32768 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float64/4096 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float64/512 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float64/64 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/static workgroup=(1024,)/Float64/65536 8 allocs: 0.141 kB 8 allocs: 0.141 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).

@vchuravy
vchuravy force-pushed the vc/dgsem-benchmarks-layout-switch branch from 8c22ee8 to fcaf647 Compare October 11, 2026 15:43
@vchuravy
vchuravy marked this pull request as ready for review October 11, 2026 15:53
@vchuravy
vchuravy force-pushed the vc/dgsem-benchmarks-layout-switch branch from fcaf647 to 863a628 Compare October 11, 2026 15:58
Base automatically changed from vc/dgsem-benchmarks-localmem-layout to main October 11, 2026 15:58
Turn the local-memory layout into a switch, as the VIJFH and VIJHF data
layouts of ClimaCore.jl and a prototype for Trixi.jl do:
`DGSEMVariableFirst()` and `DGSEMVariableLast()` are arguments of all
kernels with local memory, now also the slab kernels, and
`dgsem_default_layout(backend)` picks the variable index first on the
CPU and last on GPUs. The variants without a layout in their name use
the backend's default, and those named "v-first" or "v-last" the other
layout, so that each backend measures what its default saves.

Assisted-by: Claude Code (Opus 5.5)
@vchuravy
vchuravy force-pushed the vc/dgsem-benchmarks-layout-switch branch from 863a628 to ade3afa Compare October 11, 2026 15:58
@vchuravy
vchuravy merged commit bc4014d into main Oct 11, 2026
1 check was pending
@vchuravy
vchuravy deleted the vc/dgsem-benchmarks-layout-switch branch October 11, 2026 15:58
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