Skip to content

[release-0.9] Rebuild reshaped and permuted arrays without validation in @Const - #794

Merged
vchuravy merged 1 commit into
release-0.9from
tb/const-wrappers-0.9
Sep 25, 2026
Merged

vchuravy merged 1 commit into
release-0.9from
tb/const-wrappers-0.9

Conversation

@maleadt

@maleadt maleadt commented Sep 25, 2026

Copy link
Copy Markdown
Member

Backport of #793 to 0.9, which CUDA.jl and the other back-ends currently use. The testset on this branch had no constarg2d kernel, so that is added along with the test.

@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

main 589d21d... main / 589d21d...
const/@Const/Float32/262144 0.149 ± 0.021 ms 0.0827 ± 0.00071 ms 1.8 ± 0.25
const/@Const/Float32/65536 0.0557 ± 0.017 ms 19.5 ± 0.22 μs 2.86 ± 0.89
const/@Const/Float64/262144 0.239 ± 0.016 ms 0.166 ± 0.00088 ms 1.43 ± 0.096
const/@Const/Float64/65536 0.0809 ± 0.015 ms 0.0398 ± 0.00041 ms 2.03 ± 0.38
const/unmarked/Float32/262144 0.19 ± 0.013 ms 1.59 ± 0.0053 ms 0.12 ± 0.008
const/unmarked/Float32/65536 0.066 ± 0.016 ms 0.393 ± 0.0061 ms 0.168 ± 0.042
const/unmarked/Float64/262144 0.348 ± 0.027 ms 1.59 ± 0.0055 ms 0.219 ± 0.017
const/unmarked/Float64/65536 0.102 ± 0.011 ms 0.398 ± 0.006 ms 0.255 ± 0.028
launch/3D static workgroup, dynamic ndrange 21 ± 21 μs 0.0912 ± 0.0029 μs 230 ± 2.3e+02
launch/3D static workgroup, static ndrange 20.3 ± 20 μs 0.0445 ± 0.002 μs 456 ± 4.5e+02
launch/dynamic workgroup, dynamic ndrange 18.7 ± 18 μs 0.0516 ± 0.0014 μs 363 ± 3.6e+02
launch/dynamic workgroup, dynamic ndrange, workgroupsize given 18.1 ± 17 μs 0.0517 ± 0.0012 μs 351 ± 3.2e+02
launch/static workgroup, dynamic ndrange 19.2 ± 18 μs 28 ± 1.1 ns 687 ± 6.5e+02
launch/static workgroup, static ndrange 18.9 ± 18 μs 26.7 ± 1.2 ns 709 ± 6.7e+02
partition/dynamic workgroup, dynamic ndrange 0.0327 ± 0.0018 μs 31.5 ± 1.2 ns 1.04 ± 0.07
partition/static workgroup, dynamic ndrange 0.0414 ± 0.0088 μs 0.0388 ± 0.00087 μs 1.07 ± 0.23
partition/static workgroup, static ndrange 1.12 ± 0.001 ns 8.02 ± 3.7 ns 0.14 ± 0.064
saxpy/default/Float16/1024 21.5 ± 23 μs 0.394 ± 0.019 μs 54.6 ± 58
saxpy/default/Float16/1048576 0.2 ± 0.012 ms 0.0827 ± 0.0042 ms 2.41 ± 0.19
saxpy/default/Float16/16384 28.4 ± 18 μs 1.46 ± 0.0051 μs 19.4 ± 12
saxpy/default/Float16/2048 22.9 ± 22 μs 0.455 ± 0.016 μs 50.4 ± 49
saxpy/default/Float16/256 23.1 ± 23 μs 0.296 ± 0.0037 μs 77.8 ± 78
saxpy/default/Float16/262144 0.0674 ± 0.016 ms 19.1 ± 0.61 μs 3.52 ± 0.84
saxpy/default/Float16/32768 29.6 ± 16 μs 2.61 ± 0.0079 μs 11.4 ± 6.3
saxpy/default/Float16/4096 23.6 ± 13 μs 0.609 ± 0.017 μs 38.7 ± 21
saxpy/default/Float16/512 24.1 ± 23 μs 0.336 ± 0.0053 μs 71.5 ± 69
saxpy/default/Float16/64 0.0321 ± 0.023 ms 0.276 ± 0.019 μs 116 ± 83
saxpy/default/Float16/65536 0.034 ± 0.017 ms 4.83 ± 0.014 μs 7.04 ± 3.5
saxpy/default/Float32/1024 22.1 ± 23 μs 0.317 ± 0.0036 μs 69.9 ± 72
saxpy/default/Float32/1048576 0.184 ± 0.028 ms 0.129 ± 0.0056 ms 1.43 ± 0.23
saxpy/default/Float32/16384 26.5 ± 14 μs 1.28 ± 0.0089 μs 20.6 ± 11
saxpy/default/Float32/2048 21.9 ± 18 μs 0.338 ± 0.016 μs 64.9 ± 53
saxpy/default/Float32/256 24.3 ± 23 μs 0.278 ± 0.0022 μs 87.4 ± 83
saxpy/default/Float32/262144 0.0604 ± 0.019 ms 29.7 ± 1.6 μs 2.03 ± 0.64
saxpy/default/Float32/32768 27.9 ± 15 μs 1.77 ± 0.046 μs 15.8 ± 8.4
saxpy/default/Float32/4096 24.2 ± 17 μs 0.481 ± 0.029 μs 50.3 ± 35
saxpy/default/Float32/512 20.6 ± 23 μs 0.307 ± 0.017 μs 67.1 ± 74
saxpy/default/Float32/64 22.6 ± 23 μs 0.277 ± 0.0076 μs 81.4 ± 82
saxpy/default/Float32/65536 0.0323 ± 0.017 ms 3.59 ± 0.57 μs 8.99 ± 5
saxpy/default/Float64/1024 21.3 ± 22 μs 0.328 ± 0.0036 μs 65.1 ± 66
saxpy/default/Float64/1048576 0.214 ± 0.023 ms 0.284 ± 0.035 ms 0.753 ± 0.13
saxpy/default/Float64/16384 25.4 ± 16 μs 1.77 ± 0.031 μs 14.4 ± 8.8
saxpy/default/Float64/2048 20.9 ± 17 μs 0.472 ± 0.021 μs 44.2 ± 36
saxpy/default/Float64/256 21.4 ± 22 μs 0.289 ± 0.0056 μs 74.1 ± 77
saxpy/default/Float64/262144 0.0764 ± 0.016 ms 0.0647 ± 0.0025 ms 1.18 ± 0.25
saxpy/default/Float64/32768 27.8 ± 16 μs 3.56 ± 0.61 μs 7.81 ± 4.6
saxpy/default/Float64/4096 22.2 ± 18 μs 0.785 ± 0.0098 μs 28.2 ± 23
saxpy/default/Float64/512 20.5 ± 21 μs 0.311 ± 0.0037 μs 65.9 ± 68
saxpy/default/Float64/64 20 ± 22 μs 0.271 ± 0.019 μs 73.9 ± 81
saxpy/default/Float64/65536 0.0326 ± 0.016 ms 13 ± 1.3 μs 2.51 ± 1.3
saxpy/static workgroup=(1024,)/Float16/1024 25.1 ± 22 μs 1.2 ± 0.012 μs 20.9 ± 19
saxpy/static workgroup=(1024,)/Float16/1048576 0.199 ± 0.012 ms 0.0861 ± 0.007 ms 2.31 ± 0.23
saxpy/static workgroup=(1024,)/Float16/16384 27.1 ± 16 μs 2.35 ± 0.012 μs 11.5 ± 7
saxpy/static workgroup=(1024,)/Float16/2048 23.1 ± 21 μs 1.29 ± 0.018 μs 17.9 ± 16
saxpy/static workgroup=(1024,)/Float16/256 29.7 ± 22 μs 1.55 ± 0.015 μs 19.1 ± 14
saxpy/static workgroup=(1024,)/Float16/262144 0.0675 ± 0.016 ms 20.8 ± 0.51 μs 3.24 ± 0.77
saxpy/static workgroup=(1024,)/Float16/32768 29 ± 17 μs 3.47 ± 0.018 μs 8.36 ± 5
saxpy/static workgroup=(1024,)/Float16/4096 23.3 ± 15 μs 1.46 ± 0.022 μs 16 ± 10
saxpy/static workgroup=(1024,)/Float16/512 22.2 ± 22 μs 1.72 ± 0.015 μs 12.9 ± 13
saxpy/static workgroup=(1024,)/Float16/64 23.1 ± 22 μs 1.41 ± 0.032 μs 16.4 ± 16
saxpy/static workgroup=(1024,)/Float16/65536 0.0334 ± 0.017 ms 5.73 ± 0.032 μs 5.82 ± 3
saxpy/static workgroup=(1024,)/Float32/1024 21.5 ± 22 μs 1.14 ± 0.02 μs 18.9 ± 20
saxpy/static workgroup=(1024,)/Float32/1048576 0.181 ± 0.028 ms 0.133 ± 0.0073 ms 1.36 ± 0.22
saxpy/static workgroup=(1024,)/Float32/16384 25.7 ± 14 μs 2.09 ± 0.025 μs 12.3 ± 6.6
saxpy/static workgroup=(1024,)/Float32/2048 22.4 ± 21 μs 1.17 ± 0.026 μs 19.2 ± 18
saxpy/static workgroup=(1024,)/Float32/256 27 ± 22 μs 1.47 ± 0.018 μs 18.4 ± 15
saxpy/static workgroup=(1024,)/Float32/262144 0.0594 ± 0.019 ms 30.9 ± 1.4 μs 1.92 ± 0.62
saxpy/static workgroup=(1024,)/Float32/32768 27.4 ± 16 μs 2.61 ± 0.034 μs 10.5 ± 6.2
saxpy/static workgroup=(1024,)/Float32/4096 23.4 ± 16 μs 1.32 ± 0.034 μs 17.8 ± 12
saxpy/static workgroup=(1024,)/Float32/512 25.1 ± 22 μs 1.52 ± 0.015 μs 16.5 ± 14
saxpy/static workgroup=(1024,)/Float32/64 22.3 ± 23 μs 1.44 ± 0.028 μs 15.4 ± 16
saxpy/static workgroup=(1024,)/Float32/65536 0.0319 ± 0.018 ms 4.86 ± 0.82 μs 6.57 ± 4
saxpy/static workgroup=(1024,)/Float64/1024 21.6 ± 23 μs 1.22 ± 0.023 μs 17.7 ± 19
saxpy/static workgroup=(1024,)/Float64/1048576 0.213 ± 0.032 ms 0.29 ± 0.031 ms 0.735 ± 0.13
saxpy/static workgroup=(1024,)/Float64/16384 24.9 ± 15 μs 2.63 ± 0.033 μs 9.47 ± 5.8
saxpy/static workgroup=(1024,)/Float64/2048 21.1 ± 18 μs 1.36 ± 0.033 μs 15.6 ± 13
saxpy/static workgroup=(1024,)/Float64/256 0.0334 ± 0.021 ms 1.61 ± 0.015 μs 20.7 ± 13
saxpy/static workgroup=(1024,)/Float64/262144 0.0732 ± 0.016 ms 0.0654 ± 0.0023 ms 1.12 ± 0.25
saxpy/static workgroup=(1024,)/Float64/32768 27.2 ± 15 μs 5.03 ± 0.94 μs 5.41 ± 3.2
saxpy/static workgroup=(1024,)/Float64/4096 22.5 ± 19 μs 1.65 ± 0.1 μs 13.6 ± 11
saxpy/static workgroup=(1024,)/Float64/512 26.7 ± 22 μs 1.62 ± 0.023 μs 16.4 ± 14
saxpy/static workgroup=(1024,)/Float64/64 22 ± 22 μs 1.58 ± 0.016 μs 13.9 ± 14
saxpy/static workgroup=(1024,)/Float64/65536 0.0322 ± 0.017 ms 14.8 ± 1.2 μs 2.18 ± 1.2
time_to_load 0.494 ± 0.0038 s 0.15 ± 0.00042 s 3.28 ± 0.027

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 7278a49 into release-0.9 Sep 25, 2026
45 of 50 checks passed
@vchuravy
vchuravy deleted the tb/const-wrappers-0.9 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 79.69%. Comparing base (49dee88) to head (589d21d).
⚠️ Report is 1 commits behind head on release-0.9.

Additional details and impacted files
@@               Coverage Diff               @@
##           release-0.9     #794      +/-   ##
===============================================
+ Coverage        79.38%   79.69%   +0.31%     
===============================================
  Files               14       14              
  Lines              907      911       +4     
===============================================
+ Hits               720      726       +6     
+ Misses             187      185       -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.

2 participants