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]
>>
>
>

Reply via email to