Skip to content

Unexpected recompilation when REPL is loaded #840

Description

@christiangnrd

When run in the REPL, things that should have been precompiled seem to be ignored.

1.12:

ChrichriMBP:~/.julia/dev/Metal$ j --proj -e"using REPL, Metal; @time Metal.@sync @metal identity(nothing);"
  0.719506 seconds (3.76 M allocations: 184.910 MiB, 4.25% gc time, 84.25% compilation time: <1% of which was recompilation)
ChrichriMBP:~/.julia/dev/Metal$ j --proj -e"using Metal; @time Metal.@sync @metal identity(nothing);"
  0.167388 seconds (15.88 k allocations: 1.108 MiB, 31.50% compilation time: <1% of which was recompilation)

With --trace-compile-timing. Notice the line that takes 556ms:

Details
ChrichriMBP:~/.julia/dev/Metal$ j --proj --trace-compile=stderr --trace-compile-timing -e"using REPL, Metal; @time Metal.@sync @metal identity(nothing);"
#=    8.6 ms =# precompile(Tuple{typeof(Base.vect), Array{String, 1}, Vararg{Array{String, 1}}})
#=    6.0 ms =# precompile(Tuple{typeof(Base.iterate), Array{Array{String, 1}, 1}})
#=    3.4 ms =# precompile(Tuple{typeof(Base.vect), Base.Dict{String, Any}, Vararg{Any}})
#=    3.1 ms =# precompile(Tuple{typeof(Base.vect), Array{String, 1}, Vararg{Any}})
#=    7.4 ms =# precompile(Tuple{typeof(Base.getindex), Type{Union{Nothing, Array{String, 1}}}, Array{String, 1}, Nothing})
#=    2.5 ms =# precompile(Tuple{typeof(Base.iterate), Array{Union{Nothing, Array{String, 1}}, 1}})
#=    4.6 ms =# precompile(Tuple{typeof(Artifacts._artifact_str), Module, String, Base.SubString{String}, String, Base.Dict{String, Any}, Base.SHA1, Base.BinaryPlatforms.Platform, Base.Val{LazyArtifacts}})
#=   26.6 ms =# precompile(Tuple{typeof(Artifacts.__artifact_str), Module, String, Base.SubString{String}, String, Base.Dict{String, Any}, Base.SHA1, Base.BinaryPlatforms.Platform, Base.Val{LazyArtifacts}})
#=    0.0 ms =# precompile(Tuple{typeof(JLLWrappers.get_julia_libpaths)})
#=   52.2 ms =# precompile(Tuple{typeof(Base.get), Base.TTY, Symbol, Bool}) # recompile
#=    4.8 ms =# precompile(Tuple{typeof(Base.issorted), Array{String, 1}, Base.Order.ReverseOrdering{Base.Order.ForwardOrdering}})
#=   17.8 ms =# precompile(Tuple{typeof(GPUCompiler.assign_args!), Expr, Array{Any, 1}})
#=    2.0 ms =# precompile(Tuple{typeof(Base.indexed_iterate), Tuple{Array{Symbol, 1}, Array{Any, 1}}, Int64})
#=    1.7 ms =# precompile(Tuple{typeof(Base.indexed_iterate), Tuple{Array{Symbol, 1}, Array{Any, 1}}, Int64, Int64})
#=   26.7 ms =# precompile(Tuple{typeof(GPUCompiler.split_kwargs), Tuple{}, Array{Symbol, 1}, Vararg{Array{Symbol, 1}}})
#=    2.1 ms =# precompile(Tuple{typeof(Base.indexed_iterate), NTuple{4, Array{Any, 1}}, Int64})
#=    1.7 ms =# precompile(Tuple{typeof(Base.indexed_iterate), NTuple{4, Array{Any, 1}}, Int64, Int64})
#=    2.6 ms =# precompile(Tuple{typeof(Base.parse), Type{Bool}, String})
#=    1.3 ms =# precompile(Tuple{typeof(Base.:(>)), UInt32, UInt32})
#=    1.2 ms =# precompile(Tuple{typeof(Base.in), Symbol, NTuple{6, Symbol}})
#=    2.0 ms =# precompile(Tuple{typeof(Base.:(!=)), UInt32, UInt32})
#=  556.6 ms =# precompile(Tuple{typeof(GPUCompiler.compile), Symbol, GPUCompiler.CompilerJob{T, P} where P where T})
#=    4.7 ms =# precompile(Tuple{typeof(Base.getindex), Core.SimpleVector, Base.UnitRange{Int64}})
#=    1.5 ms =# precompile(Tuple{typeof(Base.Iterators.enumerate), Core.SimpleVector})
#=    2.4 ms =# precompile(Tuple{typeof(Base.iterate), Base.Iterators.Enumerate{Core.SimpleVector}, Tuple{Int64}})
#=    2.5 ms =# precompile(Tuple{typeof(Base.iterate), Base.Iterators.Enumerate{Core.SimpleVector}, Tuple{Int64, Int64}})
#=    1.5 ms =# precompile(Tuple{typeof(Base.getindex), Base.RefValue{Any}})
#=    2.1 ms =# precompile(Tuple{typeof(Base.indexed_iterate), Pair{Symbol, String}, Int64})
#=    2.0 ms =# precompile(Tuple{typeof(Base.indexed_iterate), Pair{Symbol, String}, Int64, Int64})
#=    4.0 ms =# precompile(Tuple{typeof(Base.haskey), Base.Dict{Symbol, Symbol}, Symbol})
#=    1.8 ms =# precompile(Tuple{typeof(Base.replace), String, Pair{String, String}})
#=    1.9 ms =# precompile(Tuple{Type{LLVM.MDTuple}, Ptr{LLVM.API.LLVMOpaqueMetadata}})
#=    1.5 ms =# precompile(Tuple{typeof(Base.length), Array{typeof(DataType), 1}})
#=    1.6 ms =# precompile(Tuple{Type{LLVM.PointerType}, Ptr{LLVM.API.LLVMOpaqueType}})
#=    1.6 ms =# precompile(Tuple{typeof(Base.getindex), Type{LLVM.LLVMType}})
#=    3.9 ms =# precompile(Tuple{typeof(Base.vect), LLVM.Function, Vararg{LLVM.Function}})
#=    1.9 ms =# precompile(Tuple{typeof(Base.getindex), Array{LLVM.LLVMType, 1}, Int64})
#=    2.5 ms =# precompile(Tuple{Type{LLVM.ConstantInt}, Int32})
#=    3.3 ms =# precompile(Tuple{typeof(Base.getproperty), GPUCompiler.MetalCompilerTarget, Symbol})
#=    1.5 ms =# precompile(Tuple{Type{Int32}, UInt32})
#=    0.0 ms =# precompile(Tuple{typeof(LLVMDowngrader_jll.llvm_downgrade)})
#=    0.0 ms =# precompile(Tuple{LLVMDowngrader_jll.var"##llvm_downgrade#8", Bool, Bool, typeof(LLVMDowngrader_jll.llvm_downgrade)})
#=    2.7 ms =# precompile(Tuple{typeof(Base.copy), Base.EnvDict})
#=    1.6 ms =# precompile(Tuple{typeof(Base.getindex), Base.RefValue{String}})
#=    0.0 ms =# precompile(Tuple{typeof(JLLWrappers.adjust_ENV!), Base.Dict{K, V} where V where K, String, String, Bool, Bool})
#=    1.6 ms =# precompile(Tuple{Type{Base.Cmd}, Array{String, 1}})
#=    1.6 ms =# precompile(Tuple{Type{NamedTuple{(:env,), T} where T<:Tuple}, Tuple{Base.Dict{String, String}}})
#=    3.1 ms =# precompile(Tuple{typeof(LLVM.name), LLVM.Function})
#=    1.2 ms =# precompile(Tuple{typeof(Base.convert), Type{Array{UInt8, 1}}, Array{UInt8, 1}})
#=    1.2 ms =# precompile(Tuple{typeof(Base.convert), Type{Base.UUID}, Base.UUID})
#=    1.4 ms =# precompile(Tuple{typeof(Base.Ryu.writefixed), Float64, Int64})
  0.762647 seconds (3.76 M allocations: 184.910 MiB, 4.32% gc time, 81.23% compilation time: <1% of which was recompilation)
#=    1.5 ms =# precompile(Tuple{Base.var"#606#607"{Base.WeakKeyDict{Metal.MTL.MTLCommandQueue, Nothing}}, Metal.MTL.MTLCommandQueue})
ChrichriMBP:~/.julia/dev/Metal$ j --proj --trace-compile=stderr --trace-compile-timing -e"using Metal; @time Metal.@sync @metal identity(nothing);"
#=    7.9 ms =# precompile(Tuple{typeof(Base.vect), Array{String, 1}, Vararg{Array{String, 1}}})
#=    5.5 ms =# precompile(Tuple{typeof(Base.iterate), Array{Array{String, 1}, 1}})
#=    4.8 ms =# precompile(Tuple{typeof(Base.vect), Base.Dict{String, Any}, Vararg{Any}})
#=    3.3 ms =# precompile(Tuple{typeof(Base.vect), Array{String, 1}, Vararg{Any}})
#=    9.1 ms =# precompile(Tuple{typeof(Base.getindex), Type{Union{Nothing, Array{String, 1}}}, Array{String, 1}, Nothing})
#=    2.8 ms =# precompile(Tuple{typeof(Base.iterate), Array{Union{Nothing, Array{String, 1}}, 1}})
#=    4.6 ms =# precompile(Tuple{typeof(Artifacts._artifact_str), Module, String, Base.SubString{String}, String, Base.Dict{String, Any}, Base.SHA1, Base.BinaryPlatforms.Platform, Base.Val{LazyArtifacts}})
#=   30.2 ms =# precompile(Tuple{typeof(Artifacts.__artifact_str), Module, String, Base.SubString{String}, String, Base.Dict{String, Any}, Base.SHA1, Base.BinaryPlatforms.Platform, Base.Val{LazyArtifacts}})
#=    0.0 ms =# precompile(Tuple{typeof(JLLWrappers.get_julia_libpaths)})
#=   36.0 ms =# precompile(Tuple{typeof(Base.get), Base.TTY, Symbol, Bool}) # recompile
#=    5.0 ms =# precompile(Tuple{typeof(Base.issorted), Array{String, 1}, Base.Order.ReverseOrdering{Base.Order.ForwardOrdering}})
#=   18.1 ms =# precompile(Tuple{typeof(GPUCompiler.assign_args!), Expr, Array{Any, 1}})
#=    2.0 ms =# precompile(Tuple{typeof(Base.indexed_iterate), Tuple{Array{Symbol, 1}, Array{Any, 1}}, Int64})
#=    1.7 ms =# precompile(Tuple{typeof(Base.indexed_iterate), Tuple{Array{Symbol, 1}, Array{Any, 1}}, Int64, Int64})
#=   27.8 ms =# precompile(Tuple{typeof(GPUCompiler.split_kwargs), Tuple{}, Array{Symbol, 1}, Vararg{Array{Symbol, 1}}})
#=    2.0 ms =# precompile(Tuple{typeof(Base.indexed_iterate), NTuple{4, Array{Any, 1}}, Int64})
#=    1.7 ms =# precompile(Tuple{typeof(Base.indexed_iterate), NTuple{4, Array{Any, 1}}, Int64, Int64})
#=    2.7 ms =# precompile(Tuple{typeof(Base.parse), Type{Bool}, String})
#=    4.4 ms =# precompile(Tuple{typeof(Base.getindex), Core.SimpleVector, Base.UnitRange{Int64}})
#=    2.1 ms =# precompile(Tuple{typeof(Base.Iterators.enumerate), Core.SimpleVector})
#=    2.8 ms =# precompile(Tuple{typeof(Base.iterate), Base.Iterators.Enumerate{Core.SimpleVector}, Tuple{Int64}})
#=    3.1 ms =# precompile(Tuple{typeof(Base.iterate), Base.Iterators.Enumerate{Core.SimpleVector}, Tuple{Int64, Int64}})
#=    1.6 ms =# precompile(Tuple{typeof(Base.getindex), Base.RefValue{Any}})
#=    2.4 ms =# precompile(Tuple{typeof(Base.indexed_iterate), Pair{Symbol, String}, Int64})
#=    2.0 ms =# precompile(Tuple{typeof(Base.indexed_iterate), Pair{Symbol, String}, Int64, Int64})
#=    4.2 ms =# precompile(Tuple{typeof(Base.haskey), Base.Dict{Symbol, Symbol}, Symbol})
#=    2.2 ms =# precompile(Tuple{typeof(Base.replace), String, Pair{String, String}})
#=    1.8 ms =# precompile(Tuple{Type{LLVM.MDTuple}, Ptr{LLVM.API.LLVMOpaqueMetadata}})
#=    1.2 ms =# precompile(Tuple{typeof(Base.length), Array{typeof(DataType), 1}})
#=    1.5 ms =# precompile(Tuple{Type{LLVM.PointerType}, Ptr{LLVM.API.LLVMOpaqueType}})
#=    1.5 ms =# precompile(Tuple{typeof(Base.getindex), Type{LLVM.LLVMType}})
#=    4.0 ms =# precompile(Tuple{typeof(Base.vect), LLVM.Function, Vararg{LLVM.Function}})
#=    2.0 ms =# precompile(Tuple{typeof(Base.getindex), Array{LLVM.LLVMType, 1}, Int64})
#=    2.4 ms =# precompile(Tuple{Type{LLVM.ConstantInt}, Int32})
#=    3.6 ms =# precompile(Tuple{typeof(Base.getproperty), GPUCompiler.MetalCompilerTarget, Symbol})
#=    1.7 ms =# precompile(Tuple{Type{Int32}, UInt32})
#=    0.0 ms =# precompile(Tuple{typeof(LLVMDowngrader_jll.llvm_downgrade)})
#=    0.0 ms =# precompile(Tuple{LLVMDowngrader_jll.var"##llvm_downgrade#8", Bool, Bool, typeof(LLVMDowngrader_jll.llvm_downgrade)})
#=    2.3 ms =# precompile(Tuple{typeof(Base.copy), Base.EnvDict})
#=    1.4 ms =# precompile(Tuple{typeof(Base.getindex), Base.RefValue{String}})
#=    0.0 ms =# precompile(Tuple{typeof(JLLWrappers.adjust_ENV!), Base.Dict{K, V} where V where K, String, String, Bool, Bool})
#=    1.8 ms =# precompile(Tuple{Type{Base.Cmd}, Array{String, 1}})
#=    1.5 ms =# precompile(Tuple{Type{NamedTuple{(:env,), T} where T<:Tuple}, Tuple{Base.Dict{String, String}}})
#=    3.3 ms =# precompile(Tuple{typeof(LLVM.name), LLVM.Function})
#=    1.2 ms =# precompile(Tuple{typeof(Base.convert), Type{Array{UInt8, 1}}, Array{UInt8, 1}})
#=    1.3 ms =# precompile(Tuple{typeof(Base.convert), Type{Base.UUID}, Base.UUID})
#=    3.7 ms =# precompile(Tuple{typeof(Core.kwcall), NamedTuple{(:msg,), Tuple{Nothing}}, typeof(Base.time_print), Base.TTY, Float64, Int64, Int64, Int64, Int64, Float64, Float64, Bool})
#=    1.3 ms =# precompile(Tuple{typeof(Base.Ryu.writefixed), Float64, Int64})
  0.188296 seconds (15.88 k allocations: 1.108 MiB, 34.58% compilation time: <1% of which was recompilation)
#=    1.4 ms =# precompile(Tuple{Base.var"#606#607"{Base.WeakKeyDict{Metal.MTL.MTLCommandQueue, Nothing}}, Metal.MTL.MTLCommandQueue})

This is potentially a Base julia issue (See JuliaLang/julia#61851 (comment) cc @adienes) but I'm. reporting here since I've personally only noticed it here.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions