Skip to content

Replace @ka_code_llvm with GPUCompiler's @device_code_* - #784

Open
vchuravy wants to merge 1 commit into
mainfrom
vc/device-code-reflection
Open

vchuravy wants to merge 1 commit into
mainfrom
vc/device-code-reflection

Conversation

@vchuravy

Copy link
Copy Markdown
Member

@ka_code_llvm is dead code on 0.10-dev.

It reflected on the host-side lowering of a kernel and explicitly rejected GPU backends:

if isa($kern, Kernel{G} where {G <: GPU})
    error("@ka_code_llvm does not support GPU kernels")
end

Since the CPU backend became an OpenCL backend and const CPU = POCLBackend <: GPU, that guard fires for every kernel on every backend, so the macro cannot be called at all:

julia> @ka_code_llvm mul2(CPU(), 16)(A, ndrange = 64)
ERROR: @ka_code_llvm does not support GPU kernels

Nothing in the test suite covered it, which is why it went unnoticed.

What this does

Removes @ka_code_llvm/ka_code_llvm, and forwards GPUCompiler's @device_code_* macros from KernelAbstractions in its place:

KernelAbstractions.@device_code_llvm debuginfo=:none mul2(backend, 64)(A, ndrange=length(A))

These install a compilation hook for the duration of the wrapped expression, so they report on the code a backend actually generates rather than on the host-side lowering, and they do so for any GPUCompiler-based backend — the in-tree CPU backend as well as CUDA, AMDGPU, oneAPI or Metal. That makes them a strictly more capable replacement than the CPU-only macro they replace. The one behavioural difference worth knowing, documented in the docstrings: the wrapped expression is really evaluated, so the kernels it launches are compiled and run.

They are not exported, because the backend packages export macros of the same name and using CUDA, KernelAbstractions would otherwise make the name ambiguous; hence the qualified spelling above.

@ka_code_typed is untouched — it reflects on the kernel function as the host sees it, which is backend-independent and still works. Its docstring now points at the @device_code_* macros for looking at generated device code.

Also: a Reflection section rewrite in docs/src/api.md, a 0.10 changelog entry, and a test in test/runtests.jl asserting that KernelAbstractions.@device_code_llvm over a kernel launch produces IR for that kernel and runs it.

Testing

  • julia --project=test test/runtests.jl: 2484 pass, 2 errors — both the pre-existing ifelse on aggregate types SPIR-V translation failures (ComplexF32/ComplexF64), which reproduce unchanged on main.
  • Docs build clean: no missing-docs and no broken cross-reference warnings, all six macros render on the API page.
  • Aqua and Runic clean.

🤖 Generated with Claude Code

https://claude.ai/code/session_01DbbtGLjxXpt7kZj6h2yVdK

`@ka_code_llvm` reflected on the host-side lowering of a kernel and explicitly
rejected GPU backends. On 0.10 the CPU backend compiles through OpenCL and
`const CPU = POCLBackend <: GPU`, so that guard now rejects every kernel on
every backend: the macro cannot be called at all, and nothing in the test suite
covered it.

Remove it, and forward GPUCompiler's `@device_code_*` macros from
KernelAbstractions instead. They install a compilation hook for the duration of
the wrapped expression, so they report on the code a backend really generates,
and they do that for any GPUCompiler-based backend -- the in-tree CPU backend as
well as CUDA, AMDGPU, oneAPI or Metal. They are deliberately not exported: the
backend packages export macros of the same name, and `using CUDA,
KernelAbstractions` would otherwise make the name ambiguous.

`@ka_code_typed` stays as it is. It reflects on the kernel function as the host
sees it, which is backend-independent and still works; its docstring now points
at the `@device_code_*` macros for looking at generated device code.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DbbtGLjxXpt7kZj6h2yVdK
Comment thread docs/src/api.md
Comment on lines +78 to +82
To look at the code a backend actually generates, wrap a kernel launch in one of the
`@device_code_*` macros below. They are GPUCompiler's, and report on every kernel compiled
while the wrapped expression runs, so they work the same on the CPU backend and on GPU
backends. They are not exported, because the backend packages (CUDA.jl, AMDGPU.jl, ...)
export macros of the same name; call them qualified:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
To look at the code a backend actually generates, wrap a kernel launch in one of the
`@device_code_*` macros below. They are GPUCompiler's, and report on every kernel compiled
while the wrapped expression runs, so they work the same on the CPU backend and on GPU
backends. They are not exported, because the backend packages (CUDA.jl, AMDGPU.jl, ...)
export macros of the same name; call them qualified:
To look at the code a backend actually generates, wrap a kernel launch in one of the
`@device_code_*` macros below. They work the same on the CPU backend and on GPU
backends, and they are public, but not exported, so you must call them qualified:

(and then make them public on 1.11+)

@github-actions

Copy link
Copy Markdown
Contributor

Benchmark Results

Show table
main 166d4d6... main / 166d4d6...
launch/3D static workgroup, dynamic ndrange 0.0473 ± 0.031 ms 0.0424 ± 0.031 ms 1.12 ± 1.1
launch/3D static workgroup, static ndrange 0.0523 ± 0.031 ms 0.0422 ± 0.032 ms 1.24 ± 1.2
launch/dynamic workgroup, dynamic ndrange 0.0425 ± 0.032 ms 0.0412 ± 0.032 ms 1.03 ± 1.1
launch/dynamic workgroup, dynamic ndrange, workgroupsize given 0.0383 ± 0.032 ms 0.0411 ± 0.032 ms 0.93 ± 1.1
launch/static workgroup, dynamic ndrange 0.0426 ± 0.032 ms 0.0408 ± 0.032 ms 1.04 ± 1.1
launch/static workgroup, static ndrange 0.0421 ± 0.032 ms 0.042 ± 0.032 ms 1 ± 1.1
partition/dynamic workgroup, dynamic ndrange 0.0582 ± 0.0014 μs 0.06 ± 0.0017 μs 0.97 ± 0.036
partition/static workgroup, dynamic ndrange 0.0663 ± 0.012 μs 0.0702 ± 0.013 μs 0.944 ± 0.24
partition/static workgroup, static ndrange 2.47 ± 0.91 ns 1.55 ± 0.009 ns 1.59 ± 0.59
saxpy/default/Float16/1024 0.0681 ± 0.029 ms 0.0678 ± 0.028 ms 1 ± 0.6
saxpy/default/Float16/1048576 0.779 ± 0.03 ms 0.775 ± 0.029 ms 1.01 ± 0.054
saxpy/default/Float16/16384 0.0589 ± 0.029 ms 0.0589 ± 0.03 ms 0.999 ± 0.71
saxpy/default/Float16/2048 0.069 ± 0.027 ms 0.0653 ± 0.026 ms 1.06 ± 0.59
saxpy/default/Float16/256 0.0411 ± 0.031 ms 0.0439 ± 0.032 ms 0.936 ± 0.99
saxpy/default/Float16/262144 0.238 ± 0.031 ms 0.234 ± 0.029 ms 1.01 ± 0.18
saxpy/default/Float16/32768 0.0691 ± 0.028 ms 0.0686 ± 0.028 ms 1.01 ± 0.57
saxpy/default/Float16/4096 0.0604 ± 0.029 ms 0.0604 ± 0.029 ms 1 ± 0.68
saxpy/default/Float16/512 0.0442 ± 0.03 ms 0.0578 ± 0.029 ms 0.765 ± 0.65
saxpy/default/Float16/64 0.0397 ± 0.03 ms 0.0441 ± 0.032 ms 0.901 ± 0.95
saxpy/default/Float16/65536 0.0913 ± 0.026 ms 0.0897 ± 0.026 ms 1.02 ± 0.41
saxpy/default/Float32/1024 0.0669 ± 0.03 ms 0.0665 ± 0.03 ms 1.01 ± 0.64
saxpy/default/Float32/1048576 0.493 ± 0.026 ms 0.477 ± 0.022 ms 1.03 ± 0.073
saxpy/default/Float32/16384 0.0546 ± 0.029 ms 0.0524 ± 0.027 ms 1.04 ± 0.77
saxpy/default/Float32/2048 0.0591 ± 0.029 ms 0.0519 ± 0.028 ms 1.14 ± 0.83
saxpy/default/Float32/256 0.0406 ± 0.031 ms 0.0492 ± 0.033 ms 0.824 ± 0.84
saxpy/default/Float32/262144 0.168 ± 0.03 ms 0.163 ± 0.029 ms 1.03 ± 0.26
saxpy/default/Float32/32768 0.0598 ± 0.028 ms 0.0587 ± 0.027 ms 1.02 ± 0.68
saxpy/default/Float32/4096 0.0601 ± 0.027 ms 0.0627 ± 0.027 ms 0.958 ± 0.59
saxpy/default/Float32/512 0.0593 ± 0.031 ms 0.0631 ± 0.03 ms 0.94 ± 0.66
saxpy/default/Float32/64 0.0404 ± 0.031 ms 0.0434 ± 0.033 ms 0.932 ± 1
saxpy/default/Float32/65536 0.0755 ± 0.028 ms 0.0732 ± 0.028 ms 1.03 ± 0.55
saxpy/default/Float64/1024 0.0563 ± 0.031 ms 0.0598 ± 0.031 ms 0.941 ± 0.72
saxpy/default/Float64/1048576 0.59 ± 0.088 ms 0.559 ± 0.067 ms 1.06 ± 0.2
saxpy/default/Float64/16384 0.0532 ± 0.028 ms 0.0508 ± 0.025 ms 1.05 ± 0.76
saxpy/default/Float64/2048 0.049 ± 0.029 ms 0.047 ± 0.028 ms 1.04 ± 0.89
saxpy/default/Float64/256 0.0465 ± 0.033 ms 0.055 ± 0.032 ms 0.847 ± 0.78
saxpy/default/Float64/262144 0.181 ± 0.034 ms 0.185 ± 0.034 ms 0.982 ± 0.26
saxpy/default/Float64/32768 0.0629 ± 0.027 ms 0.0615 ± 0.026 ms 1.02 ± 0.62
saxpy/default/Float64/4096 0.0606 ± 0.025 ms 0.0506 ± 0.025 ms 1.2 ± 0.77
saxpy/default/Float64/512 0.0568 ± 0.032 ms 0.06 ± 0.03 ms 0.946 ± 0.72
saxpy/default/Float64/64 0.0399 ± 0.031 ms 0.0417 ± 0.032 ms 0.959 ± 1.1
saxpy/default/Float64/65536 0.0814 ± 0.028 ms 0.0774 ± 0.028 ms 1.05 ± 0.53
saxpy/static workgroup=(1024,)/Float16/1024 0.0654 ± 0.028 ms 0.0644 ± 0.027 ms 1.02 ± 0.61
saxpy/static workgroup=(1024,)/Float16/1048576 0.79 ± 0.029 ms 0.774 ± 0.031 ms 1.02 ± 0.055
saxpy/static workgroup=(1024,)/Float16/16384 0.0566 ± 0.03 ms 0.0553 ± 0.03 ms 1.02 ± 0.78
saxpy/static workgroup=(1024,)/Float16/2048 0.0669 ± 0.027 ms 0.0633 ± 0.026 ms 1.06 ± 0.61
saxpy/static workgroup=(1024,)/Float16/256 0.0451 ± 0.029 ms 0.0506 ± 0.028 ms 0.892 ± 0.75
saxpy/static workgroup=(1024,)/Float16/262144 0.239 ± 0.033 ms 0.233 ± 0.032 ms 1.03 ± 0.2
saxpy/static workgroup=(1024,)/Float16/32768 0.0668 ± 0.029 ms 0.0653 ± 0.028 ms 1.02 ± 0.62
saxpy/static workgroup=(1024,)/Float16/4096 0.0495 ± 0.03 ms 0.0477 ± 0.027 ms 1.04 ± 0.86
saxpy/static workgroup=(1024,)/Float16/512 0.0491 ± 0.029 ms 0.057 ± 0.028 ms 0.863 ± 0.65
saxpy/static workgroup=(1024,)/Float16/64 0.0438 ± 0.029 ms 0.043 ± 0.028 ms 1.02 ± 0.94
saxpy/static workgroup=(1024,)/Float16/65536 0.0882 ± 0.027 ms 0.0866 ± 0.024 ms 1.02 ± 0.42
saxpy/static workgroup=(1024,)/Float32/1024 0.0645 ± 0.028 ms 0.0638 ± 0.028 ms 1.01 ± 0.62
saxpy/static workgroup=(1024,)/Float32/1048576 0.509 ± 0.034 ms 0.478 ± 0.021 ms 1.06 ± 0.085
saxpy/static workgroup=(1024,)/Float32/16384 0.0523 ± 0.028 ms 0.051 ± 0.028 ms 1.02 ± 0.79
saxpy/static workgroup=(1024,)/Float32/2048 0.056 ± 0.028 ms 0.048 ± 0.027 ms 1.17 ± 0.89
saxpy/static workgroup=(1024,)/Float32/256 0.0425 ± 0.027 ms 0.0558 ± 0.027 ms 0.762 ± 0.61
saxpy/static workgroup=(1024,)/Float32/262144 0.164 ± 0.029 ms 0.163 ± 0.028 ms 1.01 ± 0.25
saxpy/static workgroup=(1024,)/Float32/32768 0.0578 ± 0.028 ms 0.0562 ± 0.027 ms 1.03 ± 0.7
saxpy/static workgroup=(1024,)/Float32/4096 0.0472 ± 0.027 ms 0.0585 ± 0.027 ms 0.807 ± 0.6
saxpy/static workgroup=(1024,)/Float32/512 0.0607 ± 0.029 ms 0.0615 ± 0.027 ms 0.988 ± 0.64
saxpy/static workgroup=(1024,)/Float32/64 0.0467 ± 0.028 ms 0.0482 ± 0.028 ms 0.969 ± 0.8
saxpy/static workgroup=(1024,)/Float32/65536 0.0736 ± 0.029 ms 0.071 ± 0.028 ms 1.04 ± 0.58
saxpy/static workgroup=(1024,)/Float64/1024 0.058 ± 0.031 ms 0.0576 ± 0.029 ms 1.01 ± 0.74
saxpy/static workgroup=(1024,)/Float64/1048576 0.613 ± 0.11 ms 0.545 ± 0.055 ms 1.13 ± 0.23
saxpy/static workgroup=(1024,)/Float64/16384 0.0533 ± 0.028 ms 0.0497 ± 0.026 ms 1.07 ± 0.79
saxpy/static workgroup=(1024,)/Float64/2048 0.0465 ± 0.028 ms 0.0452 ± 0.027 ms 1.03 ± 0.88
saxpy/static workgroup=(1024,)/Float64/256 0.0554 ± 0.028 ms 0.0559 ± 0.027 ms 0.991 ± 0.7
saxpy/static workgroup=(1024,)/Float64/262144 0.189 ± 0.031 ms 0.187 ± 0.033 ms 1.01 ± 0.24
saxpy/static workgroup=(1024,)/Float64/32768 0.061 ± 0.026 ms 0.0586 ± 0.026 ms 1.04 ± 0.65
saxpy/static workgroup=(1024,)/Float64/4096 0.0639 ± 0.027 ms 0.0572 ± 0.026 ms 1.12 ± 0.69
saxpy/static workgroup=(1024,)/Float64/512 0.0596 ± 0.029 ms 0.0582 ± 0.028 ms 1.02 ± 0.7
saxpy/static workgroup=(1024,)/Float64/64 0.0438 ± 0.028 ms 0.0441 ± 0.027 ms 0.991 ± 0.89
saxpy/static workgroup=(1024,)/Float64/65536 0.0814 ± 0.03 ms 0.076 ± 0.028 ms 1.07 ± 0.55
time_to_load 0.821 ± 0.034 s 0.766 ± 0.0075 s 1.07 ± 0.045
main 166d4d6... main / 166d4d6...
launch/3D static workgroup, dynamic ndrange 7 allocs: 0.297 kB 7 allocs: 0.297 kB 1
launch/3D static workgroup, static ndrange 8 allocs: 0.328 kB 8 allocs: 0.328 kB 1
launch/dynamic workgroup, dynamic ndrange 17 allocs: 0.469 kB 17 allocs: 0.469 kB 1
launch/dynamic workgroup, dynamic ndrange, workgroupsize given 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
launch/static workgroup, dynamic ndrange 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
launch/static workgroup, static ndrange 4 allocs: 0.203 kB 4 allocs: 0.203 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 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float16/1048576 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float16/16384 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float16/2048 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float16/256 18 allocs: 0.484 kB 18 allocs: 0.484 kB 1
saxpy/default/Float16/262144 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float16/32768 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float16/4096 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float16/512 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float16/64 18 allocs: 0.484 kB 18 allocs: 0.484 kB 1
saxpy/default/Float16/65536 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float32/1024 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float32/1048576 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float32/16384 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float32/2048 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float32/256 18 allocs: 0.484 kB 18 allocs: 0.484 kB 1
saxpy/default/Float32/262144 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float32/32768 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float32/4096 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float32/512 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float32/64 18 allocs: 0.484 kB 18 allocs: 0.484 kB 1
saxpy/default/Float32/65536 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float64/1024 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float64/1048576 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float64/16384 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float64/2048 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float64/256 18 allocs: 0.484 kB 18 allocs: 0.484 kB 1
saxpy/default/Float64/262144 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float64/32768 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float64/4096 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float64/512 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/default/Float64/64 18 allocs: 0.484 kB 18 allocs: 0.484 kB 1
saxpy/default/Float64/65536 26 allocs: 0.609 kB 26 allocs: 0.609 kB 1
saxpy/static workgroup=(1024,)/Float16/1024 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float16/1048576 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float16/16384 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float16/2048 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float16/256 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
saxpy/static workgroup=(1024,)/Float16/262144 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float16/32768 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float16/4096 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float16/512 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float16/64 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
saxpy/static workgroup=(1024,)/Float16/65536 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float32/1024 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float32/1048576 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float32/16384 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float32/2048 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float32/256 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
saxpy/static workgroup=(1024,)/Float32/262144 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float32/32768 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float32/4096 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float32/512 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float32/64 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
saxpy/static workgroup=(1024,)/Float32/65536 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float64/1024 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float64/1048576 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float64/16384 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float64/2048 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float64/256 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
saxpy/static workgroup=(1024,)/Float64/262144 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float64/32768 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float64/4096 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float64/512 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
saxpy/static workgroup=(1024,)/Float64/64 3 allocs: 0.172 kB 3 allocs: 0.172 kB 1
saxpy/static workgroup=(1024,)/Float64/65536 6 allocs: 0.219 kB 6 allocs: 0.219 kB 1
time_to_load 0.201 k allocs: 11.8 kB 0.201 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 Sep 15, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 65.40%. Comparing base (d1e71f4) to head (166d4d6).

Additional details and impacted files
@@            Coverage Diff             @@
##             main     #784      +/-   ##
==========================================
+ Coverage   65.04%   65.40%   +0.36%     
==========================================
  Files          23       23              
  Lines        2017     2012       -5     
==========================================
+ Hits         1312     1316       +4     
+ Misses        705      696       -9     

☔ 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

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants