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