signature_type_by_tt allocates on every launch on Julia 1.14
Maintainers usually reply within 1 day
Assessment
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Newbie friendliness
- 25/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Stale
- Tech stack
- julia
- Domain
- backend, performance
Research direction
Start in the signature_type_by_tt implementation and compare its Julia 1.14 path with the pre-1.14 tuple splatting path. The reproducer in the issue measures allocations for sig_splat and sig_map; use it to verify the allocation difference and check behavior when dispatch_key changes type parameters. Done means avoiding the reported per-lookup allocations while preserving the needed dispatch behavior; pull request #1025 is already open.
Written by the indexing model from the issue text.
Description
On Julia 1.14 (where Core.TypeEgal is defined), signature_type_by_tt builds the signature with map(dispatch_key, u.parameters):
@inline function signature_type_by_tt(ft::Type, tt::Type)
u = Base.unwrap_unionall(tt)::DataType
return Base.rewrap_unionall(Tuple{dispatch_key(ft), map(dispatch_key, u.parameters)...}, tt)
end
Unlike Tuple{ft, u.parameters...}, which the pre-1.14 branch uses and which is folded to a constant for a constant tt, map over the SimpleVector isn't folded: it allocates a Vector{Any} and constructs the tuple type at run time. Since methodinstance calls this on every lookup, every kernel launch through a cached cufunction/clfunction/... allocates, proportionally to the number of arguments.
This shows up in KernelAbstractions' POCL back-end, where a launch with 4 scalar arguments allocates 128 bytes more than on Julia 1.13 and one with 40 arguments 416 bytes more (Profile.Allocs: Memory{Any}, Vector{Any} and a CorruptType from signature_type_by_tt < methodinstance < clfunction), failing KA's "POCL launch with many arguments" test on nightly.
Reproducer without GPUCompiler (same results on 1.13 and 1.14.0-DEV):
@inline function dispatch_key(@nospecialize(t))
if Base.isType(t)
u = Base.type_parameter(t)
!Base.has_free_typevars(u) && return isdefined(Core, :TypeEgal) ? Core.TypeEgal{u} : Type{u}
end
return t
end
@inline sig_splat(ft::Type, tt::Type) = Tuple{ft, (tt::DataType).parameters...}
@inline sig_map(ft::Type, tt::Type) = Tuple{dispatch_key(ft), map(dispatch_key, (tt::DataType).parameters)...}
kern(args...) = nothing
const TT = Tuple{Vector{Int}, ntuple(_ -> Int, 40)...}
f_splat() = sig_splat(typeof(kern), TT)
f_map() = sig_map(typeof(kern), TT)
f_splat(); f_map()
@show @allocated(f_splat()) # 0
@show @allocated(f_map()) # 432
Taking the splatting path unless ft or one of the parameters is a Type{...} (the only case where dispatch_key changes anything) avoids the allocations.
- Dominant language
- Julia
- Stars
- 188
- Forks
- 71
- Avg merge
- 1d 17h
- Merged PRs (30d)
- 60
Getting set up
This project ships no dev container, Dockerfile or contributing guide, so setting up is up to you: start from its README, and see our first-contribution guide for the general steps.
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from JuliaGPU/GPUCompiler.jl
-
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
JuliaGPU/GPUCompiler.jl#1008 ·
Maintainers usually reply within 1 day
-
Difficulty 4/5 3-5 days Newbie friendliness 52/100
JuliaGPU/GPUCompiler.jl#1019 ·
Maintainers usually reply within 1 day
-
Difficulty 5/5 Over a week Newbie friendliness 10/100
JuliaGPU/GPUCompiler.jl#1014 ·
Maintainers usually reply within 1 day
-
Difficulty 5/5 Over a week Newbie friendliness 12/100
JuliaGPU/GPUCompiler.jl#1011 ·
Maintainers usually reply within 1 day
-
Difficulty 5/5 Over a week Newbie friendliness 35/100
JuliaGPU/GPUCompiler.jl#970 ·
Maintainers usually reply within 1 day
All issues in JuliaGPU/GPUCompiler.jl
Similar issues
-
R_to_gamma and R_to_v are wrong for |Z| != 1 (e.g. heavy ions)Possibly taken @DavidSagan claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
bmad-sim/BeamTracking.jl#366 ·
Maintainers usually reply within 1 day
-
TSDAE's docstring implies a theta argument it does not takePossibly taken @singhharsh1708 claimed this today. Opendocumentation
Difficulty 1/5 Under an hour Newbie friendliness 74/100
SciML/PETScDiffEq.jl#282 ·
Maintainers usually reply within 1 day
-
enhancement good first issue help wanted
Difficulty 2/5 Half a day Newbie friendliness 82/100
-
SavedSubsystem with an integer save_idxs maps the index the wrong way roundPossibly taken A pull request linked to this issue is open or already merged. Open
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
SciML/SciMLBase.jl#1643 ·
Maintainers usually reply within 2 days
-
authority-vechtstromen ready-for-agent
Difficulty 1/5 Under an hour Newbie friendliness 75/100
Deltares/Ribasim-NL#890 ·
Maintainers usually reply within 1 day