function ha(x)
return (x, x)
end
function hs(x::StridedMatrix{Float64})
return (x, x)
end
In a global scope and/or REPL:
x = eye(1);
@show @allocated ha(x)
@show @allocated ha(x)
@show @allocated hs(x)
@show @allocated hs(x)
produces
#= /Users/goretkin/tmp.jl:11 =# @allocated(ha(x)) = 0
#= /Users/goretkin/tmp.jl:12 =# @allocated(ha(x)) = 0
#= /Users/goretkin/tmp.jl:13 =# @allocated(hs(x)) = 9373
#= /Users/goretkin/tmp.jl:14 =# @allocated(hs(x)) = 32
(this is on master, 0.7.0, but basically the same holds for 0.6.0, though @show @macro
prints differently I guess.)
code_native
and code_llvm
for ha(x)
and hs(x)
look identical, but the allocation is different.
If you wrap the code in a function, then all 4 @allocated
s report zero:
function doit()
x = eye(1);
@show(@allocated ha(x))
@show(@allocated ha(x))
@show(@allocated hs(x))
@show(@allocated hs(x))
end
doit()
So I guess the difference is whether the argument x
is a local or global variable. The access of x
when it is global must be causing some allocation (since the code_llvm/code_native are the same), though I don’t understand why it only affects the more specific method.
Second, I don’t understand why trying to run doit
before ha
and hs
are defined, and then running it again once ha
and hs
are defined produces different results. Possibly ha
and hs
don’t get inlined?
function doit()
x = eye(1);
@show(@allocated ha(x))
@show(@allocated ha(x))
@show(@allocated hs(x))
@show(@allocated hs(x))
end
try
doit()
catch E
@show E
end
function ha(x)
return (x, x)
end
function hs(x::StridedMatrix{Float64})
return (x, x)
end
doit()
(Came across this while investigating allocations of potrf, expecting it to be 0 in 0.7.0 (which it is). See: Storage allocation in LAPACK.potrf! - #3 by dmbates)