Skip to content

Don't interpolate KernelInterface into the expansions of @localmem and @spawn - #840

Open
vchuravy wants to merge 1 commit into
mainfrom
vc/localmem-globalref
Open

vchuravy wants to merge 1 commit into
mainfrom
vc/localmem-globalref

Conversation

@vchuravy

@vchuravy vchuravy commented Oct 4, 2026

Copy link
Copy Markdown
Member

@localmem expanded to $KI.localmemory(T, Val(dims)), with the KernelInterface module object in the expression. @spawn did the same for KI.device!, KI.wait_event, KI.synchronize, KI.device and KI.record_event.

Expressions that contain a module can't be copied with deepcopy, and @kernel deepcopies its definition. A kernel whose @localmem was expanded before @kernel saw it therefore failed with deepcopy of Modules not supported. Tools that generate kernels expand macros first: ParallelStencil.jl's @sharedMem does, see omlins/ParallelStencil.jl#221.

This interpolates the functions instead ($(KI.localmemory)(...)), as the other kernel-language macros already do (e.g. $__synchronize()).

Tests:

  • A kernel built from a pre-expanded @localmem and run on the CPU backend; this failed to load without the fix.
  • A deepcopy of an @spawn expansion.
  • The rest of the suite passes locally, except convert.jl's "signed i1 to float". That also fails on main in my local environment, so it's unrelated.

🤖 Generated with Claude Code

`@localmem` and `@spawn` expanded to `$KI.localmemory(...)` etc., with the
module object in the expression. Expressions containing a module can't be
copied with `deepcopy`, which `@kernel` does with its definition, so tools that
expand `@localmem` before `@kernel` sees it (e.g. ParallelStencil.jl) failed
with "deepcopy of Modules not supported". Interpolate the functions instead,
like the other macros do.

Assisted-by: Claude Code (Opus 5.5)
@codecov

codecov Bot commented Oct 4, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 79.34%. Comparing base (952c482) to head (c36672a).

Additional details and impacted files
@@           Coverage Diff           @@
##             main     #840   +/-   ##
=======================================
  Coverage   79.34%   79.34%           
=======================================
  Files          24       24           
  Lines        2091     2091           
=======================================
  Hits         1659     1659           
  Misses        432      432           

☔ 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 4, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results

Show table
main c36672a... main / c36672a...
const/@Const/Float32/262144 0.302 ± 0.021 ms 0.31 ± 0.024 ms 0.974 ± 0.1
const/@Const/Float32/65536 0.101 ± 0.013 ms 0.103 ± 0.011 ms 0.977 ± 0.16
const/@Const/Float64/262144 0.516 ± 0.024 ms 0.52 ± 0.029 ms 0.993 ± 0.071
const/@Const/Float64/65536 0.172 ± 0.014 ms 0.217 ± 0.014 ms 0.792 ± 0.083
const/unmarked/Float32/262144 0.538 ± 0.039 ms 0.522 ± 0.023 ms 1.03 ± 0.088
const/unmarked/Float32/65536 0.156 ± 0.015 ms 0.161 ± 0.013 ms 0.969 ± 0.12
const/unmarked/Float64/262144 0.973 ± 0.061 ms 0.98 ± 0.058 ms 0.993 ± 0.085
const/unmarked/Float64/65536 0.277 ± 0.022 ms 0.296 ± 0.031 ms 0.937 ± 0.12
launch/3D static workgroup, dynamic ndrange 20.2 ± 13 μs 14.4 ± 4.4 μs 1.41 ± 1
launch/3D static workgroup, static ndrange 14.1 ± 1.8 μs 21.4 ± 10 μs 0.659 ± 0.33
launch/dynamic workgroup, dynamic ndrange 13.8 ± 2.9 μs 11.9 ± 0.91 μs 1.16 ± 0.26
launch/dynamic workgroup, dynamic ndrange, workgroupsize given 17.9 ± 14 μs 13.5 ± 2.4 μs 1.33 ± 1
launch/static workgroup, dynamic ndrange 14.4 ± 2.4 μs 13.1 ± 3.3 μs 1.09 ± 0.33
launch/static workgroup, static ndrange 14 ± 1.8 μs 11.8 ± 1.5 μs 1.18 ± 0.21
partition/dynamic workgroup, dynamic ndrange 0.0439 ± 0.0029 μs 0.0434 ± 0.0021 μs 1.01 ± 0.082
partition/static workgroup, dynamic ndrange 0.0444 ± 0.0086 μs 0.0474 ± 0.0091 μs 0.936 ± 0.25
partition/static workgroup, static ndrange 1.12 ± 0.004 ns 1.12 ± 0.003 ns 1 ± 0.0044
saxpy/default/Float16/1024 15 ± 3.6 μs 15.2 ± 4.2 μs 0.984 ± 0.36
saxpy/default/Float16/1048576 0.404 ± 0.038 ms 0.392 ± 0.031 ms 1.03 ± 0.13
saxpy/default/Float16/16384 0.043 ± 0.0087 ms 0.0418 ± 0.0087 ms 1.03 ± 0.3
saxpy/default/Float16/2048 19.4 ± 11 μs 17.2 ± 26 μs 1.13 ± 1.8
saxpy/default/Float16/256 18.7 ± 13 μs 22.3 ± 8.1 μs 0.84 ± 0.66
saxpy/default/Float16/262144 0.138 ± 0.017 ms 0.131 ± 0.013 ms 1.05 ± 0.17
saxpy/default/Float16/32768 0.0481 ± 0.013 ms 0.0495 ± 0.011 ms 0.971 ± 0.33
saxpy/default/Float16/4096 17.3 ± 8 μs 14.9 ± 2.6 μs 1.16 ± 0.57
saxpy/default/Float16/512 23.6 ± 9.1 μs 23 ± 9 μs 1.03 ± 0.57
saxpy/default/Float16/64 15.3 ± 1.1 μs 21.9 ± 12 μs 0.696 ± 0.38
saxpy/default/Float16/65536 0.0581 ± 0.0069 ms 0.0593 ± 0.0074 ms 0.98 ± 0.17
saxpy/default/Float32/1024 19.4 ± 10 μs 15.4 ± 1.6 μs 1.26 ± 0.69
saxpy/default/Float32/1048576 0.512 ± 0.054 ms 0.504 ± 0.044 ms 1.02 ± 0.14
saxpy/default/Float32/16384 0.0386 ± 0.03 ms 0.0435 ± 0.013 ms 0.887 ± 0.73
saxpy/default/Float32/2048 16.5 ± 4.1 μs 16.1 ± 2.1 μs 1.02 ± 0.29
saxpy/default/Float32/256 15.7 ± 1.3 μs 17.1 ± 7.7 μs 0.919 ± 0.42
saxpy/default/Float32/262144 0.179 ± 0.02 ms 0.176 ± 0.022 ms 1.02 ± 0.17
saxpy/default/Float32/32768 0.0458 ± 0.015 ms 0.0528 ± 0.0077 ms 0.867 ± 0.31
saxpy/default/Float32/4096 25.9 ± 24 μs 28.6 ± 26 μs 0.907 ± 1.2
saxpy/default/Float32/512 16.2 ± 9.1 μs 15.9 ± 1.5 μs 1.02 ± 0.58
saxpy/default/Float32/64 16.7 ± 11 μs 19.7 ± 13 μs 0.851 ± 0.79
saxpy/default/Float32/65536 0.0652 ± 0.019 ms 0.0717 ± 0.011 ms 0.909 ± 0.3
saxpy/default/Float64/1024 17 ± 11 μs 19 ± 9.2 μs 0.893 ± 0.71
saxpy/default/Float64/1048576 0.96 ± 0.13 ms 1.02 ± 0.11 ms 0.943 ± 0.16
saxpy/default/Float64/16384 0.0508 ± 0.014 ms 0.053 ± 0.0082 ms 0.959 ± 0.31
saxpy/default/Float64/2048 0.0387 ± 0.027 ms 18.2 ± 26 μs 2.13 ± 3.3
saxpy/default/Float64/256 14.9 ± 1.1 μs 15 ± 2.7 μs 0.993 ± 0.19
saxpy/default/Float64/262144 0.291 ± 0.031 ms 0.291 ± 0.028 ms 1 ± 0.14
saxpy/default/Float64/32768 0.0703 ± 0.017 ms 0.0606 ± 0.019 ms 1.16 ± 0.46
saxpy/default/Float64/4096 20.2 ± 29 μs 16 ± 11 μs 1.26 ± 2
saxpy/default/Float64/512 16.4 ± 2 μs 16.2 ± 7.3 μs 1.01 ± 0.47
saxpy/default/Float64/64 14.3 ± 8.7 μs 15.8 ± 4.6 μs 0.908 ± 0.61
saxpy/default/Float64/65536 0.108 ± 0.029 ms 0.108 ± 0.025 ms 1.01 ± 0.36
saxpy/static workgroup=(1024,)/Float16/1024 15.7 ± 1.4 μs 17.5 ± 28 μs 0.899 ± 1.4
saxpy/static workgroup=(1024,)/Float16/1048576 0.407 ± 0.044 ms 0.398 ± 0.034 ms 1.02 ± 0.14
saxpy/static workgroup=(1024,)/Float16/16384 0.0424 ± 0.0093 ms 0.0426 ± 0.0092 ms 0.995 ± 0.31
saxpy/static workgroup=(1024,)/Float16/2048 17 ± 22 μs 16.4 ± 24 μs 1.03 ± 2
saxpy/static workgroup=(1024,)/Float16/256 19.9 ± 25 μs 19.7 ± 22 μs 1.01 ± 1.7
saxpy/static workgroup=(1024,)/Float16/262144 0.141 ± 0.017 ms 0.131 ± 0.013 ms 1.07 ± 0.17
saxpy/static workgroup=(1024,)/Float16/32768 0.0501 ± 0.0098 ms 0.0476 ± 0.0077 ms 1.05 ± 0.27
saxpy/static workgroup=(1024,)/Float16/4096 27.8 ± 26 μs 17.3 ± 26 μs 1.6 ± 2.8
saxpy/static workgroup=(1024,)/Float16/512 13.7 ± 2.6 μs 16.3 ± 2.6 μs 0.84 ± 0.21
saxpy/static workgroup=(1024,)/Float16/64 23.5 ± 26 μs 17.8 ± 24 μs 1.32 ± 2.3
saxpy/static workgroup=(1024,)/Float16/65536 0.0602 ± 0.0069 ms 0.0592 ± 0.0081 ms 1.02 ± 0.18
saxpy/static workgroup=(1024,)/Float32/1024 18.8 ± 11 μs 17.5 ± 20 μs 1.08 ± 1.4
saxpy/static workgroup=(1024,)/Float32/1048576 0.507 ± 0.059 ms 0.473 ± 0.04 ms 1.07 ± 0.15
saxpy/static workgroup=(1024,)/Float32/16384 16.9 ± 31 μs 15 ± 22 μs 1.13 ± 2.6
saxpy/static workgroup=(1024,)/Float32/2048 16.4 ± 1.9 μs 14.7 ± 3.6 μs 1.11 ± 0.3
saxpy/static workgroup=(1024,)/Float32/256 23.2 ± 25 μs 21.6 ± 12 μs 1.07 ± 1.3
saxpy/static workgroup=(1024,)/Float32/262144 0.184 ± 0.023 ms 0.175 ± 0.023 ms 1.05 ± 0.19
saxpy/static workgroup=(1024,)/Float32/32768 0.0528 ± 0.0074 ms 0.0518 ± 0.01 ms 1.02 ± 0.25
saxpy/static workgroup=(1024,)/Float32/4096 19.7 ± 23 μs 19.7 ± 20 μs 1 ± 1.5
saxpy/static workgroup=(1024,)/Float32/512 18.4 ± 22 μs 16.2 ± 7.6 μs 1.14 ± 1.5
saxpy/static workgroup=(1024,)/Float32/64 22.1 ± 25 μs 22.4 ± 22 μs 0.985 ± 1.5
saxpy/static workgroup=(1024,)/Float32/65536 0.0729 ± 0.0099 ms 0.0624 ± 0.019 ms 1.17 ± 0.38
saxpy/static workgroup=(1024,)/Float64/1024 15.6 ± 5.8 μs 17.2 ± 23 μs 0.905 ± 1.2
saxpy/static workgroup=(1024,)/Float64/1048576 1.01 ± 0.11 ms 0.943 ± 0.12 ms 1.07 ± 0.18
saxpy/static workgroup=(1024,)/Float64/16384 0.0515 ± 0.012 ms 0.0518 ± 0.0082 ms 0.995 ± 0.29
saxpy/static workgroup=(1024,)/Float64/2048 25 ± 24 μs 0.0393 ± 0.025 ms 0.635 ± 0.72
saxpy/static workgroup=(1024,)/Float64/256 21.4 ± 11 μs 16.9 ± 26 μs 1.27 ± 2.1
saxpy/static workgroup=(1024,)/Float64/262144 0.292 ± 0.03 ms 0.277 ± 0.031 ms 1.05 ± 0.16
saxpy/static workgroup=(1024,)/Float64/32768 0.0691 ± 0.018 ms 0.0692 ± 0.0093 ms 0.998 ± 0.29
saxpy/static workgroup=(1024,)/Float64/4096 0.038 ± 0.025 ms 0.0413 ± 0.012 ms 0.919 ± 0.65
saxpy/static workgroup=(1024,)/Float64/512 16.2 ± 2.2 μs 16.8 ± 24 μs 0.967 ± 1.4
saxpy/static workgroup=(1024,)/Float64/64 20.2 ± 11 μs 22.9 ± 13 μs 0.882 ± 0.69
saxpy/static workgroup=(1024,)/Float64/65536 0.11 ± 0.028 ms 0.107 ± 0.03 ms 1.03 ± 0.38
time_to_load 0.412 ± 0.013 s 0.412 ± 0.018 s 1 ± 0.053
main c36672a... main / c36672a...
const/@Const/Float32/262144 9 allocs: 0.203 kB 9 allocs: 0.203 kB 1
const/@Const/Float32/65536 9 allocs: 0.203 kB 9 allocs: 0.203 kB 1
const/@Const/Float64/262144 9 allocs: 0.203 kB 9 allocs: 0.203 kB 1
const/@Const/Float64/65536 9 allocs: 0.203 kB 9 allocs: 0.203 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
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 12 allocs: 0.25 kB 8 allocs: 0.141 kB 1.78
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 12 allocs: 0.25 kB 12 allocs: 0.25 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 12 allocs: 0.25 kB 8 allocs: 0.141 kB 1.78
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 12 allocs: 0.25 kB 12 allocs: 0.25 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 12 allocs: 0.25 kB 12 allocs: 0.25 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 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
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 12 allocs: 0.25 kB 12 allocs: 0.25 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).

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

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant