Following the last paragraph at docs, I want to check if julia is generating specialized version for some of my code. Testing against some built-in functions, first define
function get_sp(wfx)
for mi in wfx.specializations
if !isnothing(mi)
println(mi)
println("-"^9)
end
end
end
Then, running
exp(1)
exp(rand(3, 3))
exp(rand(Float32, 3, 3))
exp(rand(ComplexF64, 3, 3))
get_sp(@which exp(rand(3, 3)))
shows
MethodInstance for exp(::Matrix{Float64})
---------
MethodInstance for exp(::Matrix{ComplexF64})
---------
MethodInstance for exp(::Matrix{Float32})
---------
while
sin(1)
sin(1.2)
sin(0.3im)
get_sp(@which sin(.3im))
just gives
MethodInstance for sin(::ComplexF64)
---------
Is it then correct to say that, for exp(m) specialzied versions are generated for different types of matrices while no specialized version is generated for different number types to sin(x)?
Thanks!
which returns just one method, and gives the specializations of that one method. In this case, I think you want to check all methods of sin to see what specializations each of them had
1 Like
Beware, though, that which can create specializations. A fairly safe approach is to use the MethodAnalysis package:
julia> using MethodAnalysis
julia> methodinstances(sin)
Core.MethodInstance[]
julia> sin(3)
0.1411200080598672
julia> sin(3.5)
-0.35078322768961984
julia> methodinstances(sin)
2-element Vector{Core.MethodInstance}:
MethodInstance for sin(::Float64)
MethodInstance for sin(::Int64)
julia> @which sin(3)
sin(x::Real)
@ Base.Math math.jl:1488
julia> @which sin(3.5)
sin(x::T) where T<:Union{Float32, Float64}
@ Base.Math special/trig.jl:29
So you can see it aggregated the specializations across multiple methods, once those specializations were created.
If you start a fresh session and reverse the order, calling @which before the first invocation of methodinstances, you’ll see those specializations already exist—they were created by @which.
3 Likes
if which is to be avoided when looking for specializations, then the documentation needs to be updated. see the last sentence in the section linked to above.