Skip to content

Rebuild reshaped and permuted arrays without validation in @Const - #793

Merged
vchuravy merged 1 commit into
mainfrom
tb/const-wrappers
Sep 25, 2026
Merged

vchuravy merged 1 commit into
mainfrom
tb/const-wrappers

Conversation

@maleadt

@maleadt maleadt commented Sep 25, 2026

Copy link
Copy Markdown
Member

@Const adapts its argument inside the kernel, and Adapt.jl's rules for ReshapedArray (via reshape, which recomputes the SignedMultiplicativeInverses) and PermutedDimsArray (whose constructor checks isperm_inverse) go through error paths that build strings, which fails to compile on GPU back-ends. This adds ConstAdaptor-specific rules that swap in the constified parent and reuse the existing fields, which also avoids recomputing the inverses in every thread. The rules are specific to ConstAdaptor because host-side adapt relies on reshape collapsing wrappers into plain arrays.

Fixes #792

Adapt.jl's rules for ReshapedArray and PermutedDimsArray go through
constructors whose error paths build strings, which fails to compile when
`constify` runs inside a GPU kernel. Reuse the existing fields instead, as
adapting only replaces the parent array.

Fixes #792
@github-actions

Copy link
Copy Markdown
Contributor

Benchmark Results

Show table
main 6569c9d... main / 6569c9d...
const/@Const/Float32/262144 0.339 ± 0.026 ms 0.34 ± 0.032 ms 0.998 ± 0.12
const/@Const/Float32/65536 0.122 ± 0.026 ms 0.122 ± 0.026 ms 0.994 ± 0.3
const/@Const/Float64/262144 0.433 ± 0.073 ms 0.43 ± 0.076 ms 1.01 ± 0.25
const/@Const/Float64/65536 0.163 ± 0.014 ms 0.147 ± 0.026 ms 1.11 ± 0.22
const/unmarked/Float32/262144 1.16 ± 0.036 ms 1.17 ± 0.039 ms 0.994 ± 0.045
const/unmarked/Float32/65536 0.322 ± 0.032 ms 0.443 ± 0.038 ms 0.728 ± 0.096
const/unmarked/Float64/262144 1.33 ± 0.034 ms 1.34 ± 0.039 ms 0.989 ± 0.038
const/unmarked/Float64/65536 0.396 ± 0.033 ms 0.378 ± 0.039 ms 1.05 ± 0.14
launch/3D static workgroup, dynamic ndrange 0.0712 ± 0.029 ms 0.0719 ± 0.025 ms 0.99 ± 0.53
launch/3D static workgroup, static ndrange 0.072 ± 0.026 ms 0.0722 ± 0.026 ms 0.997 ± 0.51
launch/dynamic workgroup, dynamic ndrange 0.0748 ± 0.02 ms 0.0747 ± 0.024 ms 1 ± 0.42
launch/dynamic workgroup, dynamic ndrange, workgroupsize given 0.0723 ± 0.025 ms 0.0708 ± 0.03 ms 1.02 ± 0.57
launch/static workgroup, dynamic ndrange 0.0717 ± 0.026 ms 0.0719 ± 0.027 ms 0.997 ± 0.52
launch/static workgroup, static ndrange 0.0719 ± 0.026 ms 0.0719 ± 0.024 ms 1 ± 0.48
partition/dynamic workgroup, dynamic ndrange 0.0585 ± 0.0012 μs 0.0599 ± 0.0012 μs 0.977 ± 0.027
partition/static workgroup, dynamic ndrange 0.0652 ± 0.012 μs 0.067 ± 0.012 μs 0.974 ± 0.25
partition/static workgroup, static ndrange 1.55 ± 0.009 ns 1.55 ± 0.009 ns 1 ± 0.0082
saxpy/default/Float16/1024 0.0773 ± 0.02 ms 0.0774 ± 0.02 ms 0.999 ± 0.37
saxpy/default/Float16/1048576 0.775 ± 0.027 ms 0.776 ± 0.029 ms 0.999 ± 0.052
saxpy/default/Float16/16384 0.0647 ± 0.032 ms 0.0653 ± 0.033 ms 0.991 ± 0.7
saxpy/default/Float16/2048 0.0799 ± 0.023 ms 0.0795 ± 0.026 ms 1.01 ± 0.44
saxpy/default/Float16/256 0.0766 ± 0.023 ms 0.0763 ± 0.019 ms 1 ± 0.39
saxpy/default/Float16/262144 0.236 ± 0.029 ms 0.237 ± 0.031 ms 0.996 ± 0.18
saxpy/default/Float16/32768 0.0742 ± 0.03 ms 0.0742 ± 0.031 ms 1 ± 0.58
saxpy/default/Float16/4096 0.0817 ± 0.031 ms 0.0816 ± 0.031 ms 1 ± 0.53
saxpy/default/Float16/512 0.077 ± 0.019 ms 0.0763 ± 0.012 ms 1.01 ± 0.29
saxpy/default/Float16/64 0.0762 ± 0.021 ms 0.0761 ± 0.017 ms 1 ± 0.35
saxpy/default/Float16/65536 0.0958 ± 0.027 ms 0.0955 ± 0.027 ms 1 ± 0.4
saxpy/default/Float32/1024 0.0763 ± 0.02 ms 0.0759 ± 0.017 ms 1.01 ± 0.35
saxpy/default/Float32/1048576 0.484 ± 0.026 ms 0.477 ± 0.024 ms 1.02 ± 0.075
saxpy/default/Float32/16384 0.0583 ± 0.031 ms 0.0573 ± 0.031 ms 1.02 ± 0.76
saxpy/default/Float32/2048 0.0762 ± 0.028 ms 0.0753 ± 0.029 ms 1.01 ± 0.54
saxpy/default/Float32/256 0.0761 ± 0.024 ms 0.076 ± 0.013 ms 1 ± 0.36
saxpy/default/Float32/262144 0.164 ± 0.029 ms 0.164 ± 0.029 ms 1 ± 0.25
saxpy/default/Float32/32768 0.0643 ± 0.029 ms 0.063 ± 0.028 ms 1.02 ± 0.64
saxpy/default/Float32/4096 0.0735 ± 0.032 ms 0.0699 ± 0.031 ms 1.05 ± 0.66
saxpy/default/Float32/512 0.0753 ± 0.021 ms 0.0759 ± 0.017 ms 0.993 ± 0.36
saxpy/default/Float32/64 0.0767 ± 0.02 ms 0.0761 ± 0.016 ms 1.01 ± 0.34
saxpy/default/Float32/65536 0.0788 ± 0.029 ms 0.0778 ± 0.029 ms 1.01 ± 0.53
saxpy/default/Float64/1024 0.0759 ± 0.023 ms 0.0754 ± 0.023 ms 1.01 ± 0.44
saxpy/default/Float64/1048576 0.549 ± 0.089 ms 0.523 ± 0.082 ms 1.05 ± 0.24
saxpy/default/Float64/16384 0.0576 ± 0.028 ms 0.0569 ± 0.026 ms 1.01 ± 0.68
saxpy/default/Float64/2048 0.0756 ± 0.03 ms 0.0746 ± 0.032 ms 1.01 ± 0.59
saxpy/default/Float64/256 0.0756 ± 0.022 ms 0.0755 ± 0.018 ms 1 ± 0.38
saxpy/default/Float64/262144 0.179 ± 0.034 ms 0.175 ± 0.034 ms 1.02 ± 0.28
saxpy/default/Float64/32768 0.0665 ± 0.028 ms 0.0662 ± 0.028 ms 1 ± 0.6
saxpy/default/Float64/4096 0.0701 ± 0.03 ms 0.064 ± 0.029 ms 1.1 ± 0.68
saxpy/default/Float64/512 0.076 ± 0.018 ms 0.0754 ± 0.025 ms 1.01 ± 0.4
saxpy/default/Float64/64 0.0763 ± 0.021 ms 0.0767 ± 0.016 ms 0.995 ± 0.34
saxpy/default/Float64/65536 0.0847 ± 0.028 ms 0.0831 ± 0.028 ms 1.02 ± 0.48
saxpy/static workgroup=(1024,)/Float16/1024 0.074 ± 0.024 ms 0.0738 ± 0.025 ms 1 ± 0.47
saxpy/static workgroup=(1024,)/Float16/1048576 0.774 ± 0.028 ms 0.769 ± 0.028 ms 1.01 ± 0.052
saxpy/static workgroup=(1024,)/Float16/16384 0.0599 ± 0.03 ms 0.0595 ± 0.03 ms 1.01 ± 0.72
saxpy/static workgroup=(1024,)/Float16/2048 0.0759 ± 0.029 ms 0.0759 ± 0.029 ms 1 ± 0.54
saxpy/static workgroup=(1024,)/Float16/256 0.0729 ± 0.028 ms 0.0729 ± 0.024 ms 1 ± 0.5
saxpy/static workgroup=(1024,)/Float16/262144 0.229 ± 0.03 ms 0.231 ± 0.031 ms 0.994 ± 0.19
saxpy/static workgroup=(1024,)/Float16/32768 0.0697 ± 0.027 ms 0.0696 ± 0.028 ms 1 ± 0.56
saxpy/static workgroup=(1024,)/Float16/4096 0.078 ± 0.032 ms 0.0761 ± 0.033 ms 1.02 ± 0.61
saxpy/static workgroup=(1024,)/Float16/512 0.0733 ± 0.028 ms 0.0736 ± 0.022 ms 0.996 ± 0.48
saxpy/static workgroup=(1024,)/Float16/64 0.0733 ± 0.026 ms 0.073 ± 0.022 ms 1 ± 0.46
saxpy/static workgroup=(1024,)/Float16/65536 0.0912 ± 0.024 ms 0.0907 ± 0.023 ms 1.01 ± 0.36
saxpy/static workgroup=(1024,)/Float32/1024 0.0733 ± 0.022 ms 0.0726 ± 0.02 ms 1.01 ± 0.41
saxpy/static workgroup=(1024,)/Float32/1048576 0.477 ± 0.022 ms 0.473 ± 0.023 ms 1.01 ± 0.067
saxpy/static workgroup=(1024,)/Float32/16384 0.0541 ± 0.027 ms 0.0536 ± 0.025 ms 1.01 ± 0.7
saxpy/static workgroup=(1024,)/Float32/2048 0.0722 ± 0.029 ms 0.07 ± 0.029 ms 1.03 ± 0.6
saxpy/static workgroup=(1024,)/Float32/256 0.0733 ± 0.026 ms 0.0728 ± 0.025 ms 1.01 ± 0.49
saxpy/static workgroup=(1024,)/Float32/262144 0.162 ± 0.028 ms 0.157 ± 0.028 ms 1.03 ± 0.25
saxpy/static workgroup=(1024,)/Float32/32768 0.06 ± 0.026 ms 0.0592 ± 0.024 ms 1.01 ± 0.61
saxpy/static workgroup=(1024,)/Float32/4096 0.0688 ± 0.034 ms 0.071 ± 0.033 ms 0.97 ± 0.66
saxpy/static workgroup=(1024,)/Float32/512 0.0729 ± 0.022 ms 0.073 ± 0.024 ms 0.998 ± 0.45
saxpy/static workgroup=(1024,)/Float32/64 0.0731 ± 0.026 ms 0.0732 ± 0.027 ms 0.999 ± 0.52
saxpy/static workgroup=(1024,)/Float32/65536 0.0748 ± 0.027 ms 0.0727 ± 0.025 ms 1.03 ± 0.52
saxpy/static workgroup=(1024,)/Float64/1024 0.0731 ± 0.024 ms 0.0723 ± 0.026 ms 1.01 ± 0.49
saxpy/static workgroup=(1024,)/Float64/1048576 0.552 ± 0.094 ms 0.514 ± 0.064 ms 1.07 ± 0.23
saxpy/static workgroup=(1024,)/Float64/16384 0.056 ± 0.026 ms 0.0541 ± 0.025 ms 1.04 ± 0.68
saxpy/static workgroup=(1024,)/Float64/2048 0.073 ± 0.029 ms 0.0707 ± 0.03 ms 1.03 ± 0.6
saxpy/static workgroup=(1024,)/Float64/256 0.0731 ± 0.023 ms 0.073 ± 0.023 ms 1 ± 0.44
saxpy/static workgroup=(1024,)/Float64/262144 0.177 ± 0.031 ms 0.175 ± 0.031 ms 1.01 ± 0.25
saxpy/static workgroup=(1024,)/Float64/32768 0.0649 ± 0.026 ms 0.0628 ± 0.026 ms 1.03 ± 0.6
saxpy/static workgroup=(1024,)/Float64/4096 0.0622 ± 0.031 ms 0.0604 ± 0.03 ms 1.03 ± 0.73
saxpy/static workgroup=(1024,)/Float64/512 0.0728 ± 0.025 ms 0.073 ± 0.023 ms 0.998 ± 0.46
saxpy/static workgroup=(1024,)/Float64/64 0.0731 ± 0.028 ms 0.0733 ± 0.022 ms 0.998 ± 0.49
saxpy/static workgroup=(1024,)/Float64/65536 0.0832 ± 0.028 ms 0.0806 ± 0.027 ms 1.03 ± 0.49
time_to_load 0.764 ± 0.0032 s 0.827 ± 0.032 s 0.924 ± 0.036
main 6569c9d... main / 6569c9d...
const/@Const/Float32/262144 1 allocs: 16 B 1 allocs: 16 B 1
const/@Const/Float32/65536 1 allocs: 16 B 1 allocs: 16 B 1
const/@Const/Float64/262144 1 allocs: 16 B 1 allocs: 16 B 1
const/@Const/Float64/65536 1 allocs: 16 B 1 allocs: 16 B 1
const/unmarked/Float32/262144 1 allocs: 16 B 1 allocs: 16 B 1
const/unmarked/Float32/65536 1 allocs: 16 B 1 allocs: 16 B 1
const/unmarked/Float64/262144 1 allocs: 16 B 1 allocs: 16 B 1
const/unmarked/Float64/65536 1 allocs: 16 B 1 allocs: 16 B 1
launch/3D static workgroup, dynamic ndrange 5 allocs: 0.141 kB 5 allocs: 0.141 kB 1
launch/3D static workgroup, static ndrange 6 allocs: 0.172 kB 6 allocs: 0.172 kB 1
launch/dynamic workgroup, dynamic ndrange 15 allocs: 0.312 kB 15 allocs: 0.312 kB 1
launch/dynamic workgroup, dynamic ndrange, workgroupsize given 1 allocs: 16 B 1 allocs: 16 B 1
launch/static workgroup, dynamic ndrange 1 allocs: 16 B 1 allocs: 16 B 1
launch/static workgroup, static ndrange 2 allocs: 0.0469 kB 2 allocs: 0.0469 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 24 allocs: 0.453 kB 24 allocs: 0.453 kB 1
saxpy/default/Float16/1048576 24 allocs: 0.453 kB 24 allocs: 0.453 kB 1
saxpy/default/Float16/16384 24 allocs: 0.453 kB 24 allocs: 0.453 kB 1
saxpy/default/Float16/2048 24 allocs: 0.453 kB 24 allocs: 0.453 kB 1
saxpy/default/Float16/256 16 allocs: 0.328 kB 16 allocs: 0.328 kB 1
saxpy/default/Float16/262144 24 allocs: 0.453 kB 24 allocs: 0.453 kB 1
saxpy/default/Float16/32768 24 allocs: 0.453 kB 24 allocs: 0.453 kB 1
saxpy/default/Float16/4096 24 allocs: 0.453 kB 24 allocs: 0.453 kB 1
saxpy/default/Float16/512 24 allocs: 0.453 kB 24 allocs: 0.453 kB 1
saxpy/default/Float16/64 16 allocs: 0.328 kB 16 allocs: 0.328 kB 1
saxpy/default/Float16/65536 24 allocs: 0.453 kB 24 allocs: 0.453 kB 1
saxpy/default/Float32/1024 24 allocs: 0.453 kB 24 allocs: 0.453 kB 1
saxpy/default/Float32/1048576 24 allocs: 0.453 kB 24 allocs: 0.453 kB 1
saxpy/default/Float32/16384 24 allocs: 0.453 kB 24 allocs: 0.453 kB 1
saxpy/default/Float32/2048 24 allocs: 0.453 kB 24 allocs: 0.453 kB 1
saxpy/default/Float32/256 16 allocs: 0.328 kB 16 allocs: 0.328 kB 1
saxpy/default/Float32/262144 24 allocs: 0.453 kB 24 allocs: 0.453 kB 1
saxpy/default/Float32/32768 24 allocs: 0.453 kB 24 allocs: 0.453 kB 1
saxpy/default/Float32/4096 24 allocs: 0.453 kB 24 allocs: 0.453 kB 1
saxpy/default/Float32/512 24 allocs: 0.453 kB 24 allocs: 0.453 kB 1
saxpy/default/Float32/64 16 allocs: 0.328 kB 16 allocs: 0.328 kB 1
saxpy/default/Float32/65536 24 allocs: 0.453 kB 24 allocs: 0.453 kB 1
saxpy/default/Float64/1024 24 allocs: 0.453 kB 24 allocs: 0.453 kB 1
saxpy/default/Float64/1048576 24 allocs: 0.453 kB 24 allocs: 0.453 kB 1
saxpy/default/Float64/16384 24 allocs: 0.453 kB 24 allocs: 0.453 kB 1
saxpy/default/Float64/2048 24 allocs: 0.453 kB 24 allocs: 0.453 kB 1
saxpy/default/Float64/256 16 allocs: 0.328 kB 16 allocs: 0.328 kB 1
saxpy/default/Float64/262144 24 allocs: 0.453 kB 24 allocs: 0.453 kB 1
saxpy/default/Float64/32768 24 allocs: 0.453 kB 24 allocs: 0.453 kB 1
saxpy/default/Float64/4096 24 allocs: 0.453 kB 24 allocs: 0.453 kB 1
saxpy/default/Float64/512 24 allocs: 0.453 kB 24 allocs: 0.453 kB 1
saxpy/default/Float64/64 16 allocs: 0.328 kB 16 allocs: 0.328 kB 1
saxpy/default/Float64/65536 24 allocs: 0.453 kB 24 allocs: 0.453 kB 1
saxpy/static workgroup=(1024,)/Float16/1024 4 allocs: 0.0625 kB 4 allocs: 0.0625 kB 1
saxpy/static workgroup=(1024,)/Float16/1048576 4 allocs: 0.0625 kB 4 allocs: 0.0625 kB 1
saxpy/static workgroup=(1024,)/Float16/16384 4 allocs: 0.0625 kB 4 allocs: 0.0625 kB 1
saxpy/static workgroup=(1024,)/Float16/2048 4 allocs: 0.0625 kB 4 allocs: 0.0625 kB 1
saxpy/static workgroup=(1024,)/Float16/256 1 allocs: 16 B 1 allocs: 16 B 1
saxpy/static workgroup=(1024,)/Float16/262144 4 allocs: 0.0625 kB 4 allocs: 0.0625 kB 1
saxpy/static workgroup=(1024,)/Float16/32768 4 allocs: 0.0625 kB 4 allocs: 0.0625 kB 1
saxpy/static workgroup=(1024,)/Float16/4096 4 allocs: 0.0625 kB 4 allocs: 0.0625 kB 1
saxpy/static workgroup=(1024,)/Float16/512 4 allocs: 0.0625 kB 4 allocs: 0.0625 kB 1
saxpy/static workgroup=(1024,)/Float16/64 1 allocs: 16 B 1 allocs: 16 B 1
saxpy/static workgroup=(1024,)/Float16/65536 4 allocs: 0.0625 kB 4 allocs: 0.0625 kB 1
saxpy/static workgroup=(1024,)/Float32/1024 4 allocs: 0.0625 kB 4 allocs: 0.0625 kB 1
saxpy/static workgroup=(1024,)/Float32/1048576 4 allocs: 0.0625 kB 4 allocs: 0.0625 kB 1
saxpy/static workgroup=(1024,)/Float32/16384 4 allocs: 0.0625 kB 4 allocs: 0.0625 kB 1
saxpy/static workgroup=(1024,)/Float32/2048 4 allocs: 0.0625 kB 4 allocs: 0.0625 kB 1
saxpy/static workgroup=(1024,)/Float32/256 1 allocs: 16 B 1 allocs: 16 B 1
saxpy/static workgroup=(1024,)/Float32/262144 4 allocs: 0.0625 kB 4 allocs: 0.0625 kB 1
saxpy/static workgroup=(1024,)/Float32/32768 4 allocs: 0.0625 kB 4 allocs: 0.0625 kB 1
saxpy/static workgroup=(1024,)/Float32/4096 4 allocs: 0.0625 kB 4 allocs: 0.0625 kB 1
saxpy/static workgroup=(1024,)/Float32/512 4 allocs: 0.0625 kB 4 allocs: 0.0625 kB 1
saxpy/static workgroup=(1024,)/Float32/64 1 allocs: 16 B 1 allocs: 16 B 1
saxpy/static workgroup=(1024,)/Float32/65536 4 allocs: 0.0625 kB 4 allocs: 0.0625 kB 1
saxpy/static workgroup=(1024,)/Float64/1024 4 allocs: 0.0625 kB 4 allocs: 0.0625 kB 1
saxpy/static workgroup=(1024,)/Float64/1048576 4 allocs: 0.0625 kB 4 allocs: 0.0625 kB 1
saxpy/static workgroup=(1024,)/Float64/16384 4 allocs: 0.0625 kB 4 allocs: 0.0625 kB 1
saxpy/static workgroup=(1024,)/Float64/2048 4 allocs: 0.0625 kB 4 allocs: 0.0625 kB 1
saxpy/static workgroup=(1024,)/Float64/256 1 allocs: 16 B 1 allocs: 16 B 1
saxpy/static workgroup=(1024,)/Float64/262144 4 allocs: 0.0625 kB 4 allocs: 0.0625 kB 1
saxpy/static workgroup=(1024,)/Float64/32768 4 allocs: 0.0625 kB 4 allocs: 0.0625 kB 1
saxpy/static workgroup=(1024,)/Float64/4096 4 allocs: 0.0625 kB 4 allocs: 0.0625 kB 1
saxpy/static workgroup=(1024,)/Float64/512 4 allocs: 0.0625 kB 4 allocs: 0.0625 kB 1
saxpy/static workgroup=(1024,)/Float64/64 1 allocs: 16 B 1 allocs: 16 B 1
saxpy/static workgroup=(1024,)/Float64/65536 4 allocs: 0.0625 kB 4 allocs: 0.0625 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).

@vchuravy
vchuravy merged commit d63c607 into main Sep 25, 2026
77 of 78 checks passed
@vchuravy
vchuravy deleted the tb/const-wrappers branch September 25, 2026 13:49
@codecov

codecov Bot commented Sep 25, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 67.04%. Comparing base (c657ae2) to head (6569c9d).
⚠️ Report is 2 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main     #793      +/-   ##
==========================================
+ Coverage   66.88%   67.04%   +0.16%     
==========================================
  Files          24       24              
  Lines        2023     2027       +4     
==========================================
+ Hits         1353     1359       +6     
+ Misses        670      668       -2     

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

@Const on a reshaped view fails to compile on CUDA

2 participants