Done in https://github.com/JuliaLang/julia/issues/9772
2015-01-14 10:19 GMT-05:00 Andreas Noack <[email protected]>: > There appears to be a problem with rfft. > > julia> @code_typed rfft(randn(10)) > > 1-element Array{Any,1}: > > :($(Expr(:lambda, Any[:X], > Any[Any[],Any[Any[:X,Array{Float64,1},0]],Any[]], :(begin # fftw.jl, line > 639: > > return rfft(X::Array{Float64,1},$(Expr(:new, UnitRange{Int64}, 1, > :(((top(getfield))(Intrinsics,:select_value))((top(sle_int))(1,1)::Bool,1,(top(box))(Int64,(top(sub_int))(1,1)))::Int64)))) > ::Any > > end::Any)))) > > Could you file an issue? > > 2015-01-14 2:39 GMT-05:00 <[email protected]>: > > Hi all, >> >> In the code below I define two functions, f1 and f2, that take a >> three-dimensional array of Float64, computes the real FFT (rfft) and loops >> once over the computed values of the rfft. In f1, a lot of time is spent in >> the simple for loop, and many, many bytes are allocated. In f2, very little >> time is spent in the for loop, and no bytes are allocated, as would be >> expected. The only difference between the two functions is "X = rfft(x)" >> in f1 and "X = rfft(x) :: Array{Complex{Float64}, 3}" in f2. For both >> functions, typeof(X) says that X is an Array{Complex{Float64}, 3}, so the >> extra type annotation in f2 should not be necessary. >> >> I encountered this problem in Julia version 0.3.6 and it persists in >> version 0.4.0-dev+2666. In 0.4.0 the macro @code_warntype can be used to >> reveal that X is of type ANY in f1 but Array{Complex{Float64}, 3} in f2. >> This seems to contradict the output of typeof(X) and is very confusing to >> me. >> >> Cheers, >> Emil >> >> ### Code >> >> function f1(x :: Array{Float64, 3}) >> @time X = rfft(x) >> println("typeof(X) = $(typeof(X))") >> @time for i = 1 : length(X) >> X[i] *= X[i] >> end >> X >> end >> >> function f2(x :: Array{Float64, 3}) >> @time X = rfft(x) :: Array{Complex{Float64}, 3} >> println("typeof(X) = $(typeof(X))") >> @time for i = 1 : length(X) >> X[i] *= X[i] >> end >> X >> end >> >> println("Compiling...") >> f1(rand(2,2,2)) >> f2(rand(2,2,2)) >> >> println("f1...") >> f1(rand(128,128,128)) >> println("f2...") >> f2(rand(128,128,128)) >> >> @code_warntype f1(rand(2,2,2)) >> @code_warntype f2(rand(2,2,2)) >> >> ### Output >> >> Compiling... >> elapsed time: 0.165980813 seconds (5783476 bytes allocated) >> typeof(X) = Array{Complex{Float64},3} >> elapsed time: 0.008426071 seconds (319840 bytes allocated) >> elapsed time: 9.8616e-5 seconds (3560 bytes allocated) >> typeof(X) = Array{Complex{Float64},3} >> elapsed time: 6.28e-7 seconds (0 bytes allocated) >> f1... >> elapsed time: 0.022922817 seconds (17042840 bytes allocated) >> typeof(X) = Array{Complex{Float64},3} >> elapsed time: 0.419889359 seconds (144836816 bytes allocated, 16.67% gc >> time) >> f2... >> elapsed time: 0.023057751 seconds (17042840 bytes allocated) >> typeof(X) = Array{Complex{Float64},3} >> elapsed time: 0.002572673 seconds (0 bytes allocated) >> >> [output of @code_warntype is omitted] >> > >
