查看不在函数中的降级版Julia代码

时间:2018-05-07 21:26:57

标签: julia

我正在阅读涉及全局变量的this question about performance,并希望了解Julia如何翻译此代码。我意识到code_warntype不能以通常的方式在这里使用,因为代码不在函数中,并且将它包装在函数中会破坏练习的整个点。

是否存在@code_warntype的模拟或其他版本将直接采用一些Julia代码(例如,作为文件名,或作为普通字符串)并向我们显示该代码的类型化降级版本?或者可能是输出降低代码的命令行标志? (似乎有用于生成LLVM代码或目标文件的标志,但没有用于输出只是推断和降低类型的代码。)

1 个答案:

答案 0 :(得分:2)

您始终可以将有问题的代码包装到函数中并在其上调用@code_warntype

以下是关联问题的示例:

n=5000;
x=rand(n)
y=rand(n)
mn=ones(n)*1000;
function foo()
    for i in 1:n;
        for j in 1:n;
            c=abs(x[j]-y[i]);
            if(c<mn[i])
                mn[i]=c;
            end
        end
    end
end

julia> @code_warntype foo()
Variables:
  #temp#@_2::Any
  i::Any
  #temp#@_4::Any
  j::Any
  c::Any

Body:
  begin
      Core.SSAValue(0) = (1:Main.n)::Any
      #temp#@_2::Any = (Base.start)(Core.SSAValue(0))::Any
      3: 
      Core.SSAValue(1) = (Base.done)(Core.SSAValue(0), #temp#@_2::Any)::Any
      Core.SSAValue(2) = (Core.typeassert)(Core.SSAValue(1), Core.Bool)::Bool
      Core.SSAValue(3) = (Base.not_int)(Core.SSAValue(2))::Bool
      unless Core.SSAValue(3) goto 37
      Core.SSAValue(4) = (Base.next)(Core.SSAValue(0), #temp#@_2::Any)::Any
      i::Any = (Core.getfield)(Core.SSAValue(4), 1)::Any
      #temp#@_2::Any = (Core.getfield)(Core.SSAValue(4), 2)::Any
      #= line 2 =#
      Core.SSAValue(5) = (1:Main.n)::Any
      #temp#@_4::Any = (Base.start)(Core.SSAValue(5))::Any
      14: 
      Core.SSAValue(6) = (Base.done)(Core.SSAValue(5), #temp#@_4::Any)::Any
      Core.SSAValue(7) = (Core.typeassert)(Core.SSAValue(6), Core.Bool)::Bool
      Core.SSAValue(8) = (Base.not_int)(Core.SSAValue(7))::Bool
      unless Core.SSAValue(8) goto 35
      Core.SSAValue(9) = (Base.next)(Core.SSAValue(5), #temp#@_4::Any)::Any
      j::Any = (Core.getfield)(Core.SSAValue(9), 1)::Any
      #temp#@_4::Any = (Core.getfield)(Core.SSAValue(9), 2)::Any
      #= line 3 =#
      Core.SSAValue(10) = (Base.getindex)(Main.x, j::Any)::Any
      Core.SSAValue(11) = (Base.getindex)(Main.y, i::Any)::Any
      Core.SSAValue(12) = (Core.SSAValue(10) - Core.SSAValue(11))::Any
      c::Any = (Main.abs)(Core.SSAValue(12))::Any
      #= line 5 =#
      Core.SSAValue(14) = (Base.getindex)(Main.mn, i::Any)::Any
      Core.SSAValue(15) = (c::Any < Core.SSAValue(14))::Any
      unless Core.SSAValue(15) goto 33
      #= line 6 =#
      (Base.setindex!)(Main.mn, c::Any, i::Any)::Any
      33: 
      goto 14
      35: 
      goto 3
      37: 
      return
  end::Nothing

将上述内容与

进行比较
function foo()
    n=5000;
    x=rand(n)
    y=rand(n)
    mn=ones(n)*1000;
    for i in 1:n;
        for j in 1:n;
            c=abs(x[j]-y[i]);
            if(c<mn[i])
                mn[i]=c;
            end
        end
    end
end

julia> @code_warntype foo()
Variables:
  n<optimized out>
  x<optimized out>
  y<optimized out>
  mn::Array{Float64,1}
  #temp#@_6::Int64
  i<optimized out>
  #temp#@_8::Int64
  j<optimized out>
  c<optimized out>
  #temp#@_13::Bool
  #temp#@_16::Bool

Body:
  begin
      #= line 3 =#
      # meta: location /buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/Random.jl rand 224
      # meta: location /buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/Random.jl rand 236
      # meta: location /buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/Random.jl rand 235
      # meta: location boot.jl Type 397
      # meta: location boot.jl Type 389
      # meta: location boot.jl Type 380
      Core.SSAValue(46) = $(Expr(:foreigncall, :(:jl_alloc_array_1d), Array{Float64,1}, svec(Any, Int64), :(:ccall), 2, Array{Float64,1}, 5000, 5000))
      # meta: pop locations (3)
      # meta: location /buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/Random.jl rand! 214
      # meta: location /buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/RNGs.jl rand! 447
      # meta: location array.jl length 137
      Core.SSAValue(53) = (Base.arraylen)(Core.SSAValue(46))::Int64
      # meta: pop location
      # meta: location /buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/RNGs.jl _rand! 440
      # meta: location int.jl * 54
      Core.SSAValue(66) = (Base.mul_int)(8, Core.SSAValue(53))::Int64
      # meta: pop location
      # meta: location array.jl length 137
      Core.SSAValue(67) = (Base.arraylen)(Core.SSAValue(46))::Int64
      # meta: pop location
      # meta: location int.jl * 54
      Core.SSAValue(68) = (Base.mul_int)(8, Core.SSAValue(67))::Int64
      # meta: pop location
      # meta: location int.jl <= 419
      Core.SSAValue(69) = (Base.sle_int)(Core.SSAValue(66), Core.SSAValue(68))::Bool
      # meta: pop location
      unless Core.SSAValue(69) goto 31
      #temp#@_13::Bool = true
      goto 33
      31: 
      #temp#@_13::Bool = false
      33: 
      unless #temp#@_13::Bool goto 36
      goto 41
      36: 
      # meta: location boot.jl Type 281
      Core.SSAValue(71) = $(Expr(:new, :(Core.AssertionError), "sizeof(Float64) * n64 <= sizeof(T) * length(A) && isbits(T)"))
      # meta: pop location
      (Base.throw)(Core.SSAValue(71))::Union{}
      41: 
      #= line 441 =#
      # meta: location gcutils.jl
      #= line 81 =#
      Core.SSAValue(61) = $(Expr(:gc_preserve_begin, Core.SSAValue(46)))
      #= line 82 =#
      # meta: location abstractarray.jl pointer 911
      # meta: location pointer.jl unsafe_convert 65
      Core.SSAValue(74) = $(Expr(:foreigncall, :(:jl_array_ptr), Ptr{Float64}, svec(Any), :(:ccall), 1, Core.SSAValue(46)))
      # meta: pop locations (2)
      # meta: location /buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/RNGs.jl Type 365
      Core.SSAValue(79) = $(Expr(:new, Random.UnsafeView{Float64}, Core.SSAValue(74), Core.SSAValue(53)))
      # meta: pop location
      $(Expr(:invoke, MethodInstance for rand!(::Random.MersenneTwister, ::Random.UnsafeView{Float64}, ::Random.SamplerTrivial{Random.CloseOpen01{Float64},Float64}), :(Random.rand!), :(Random.GLOBAL_RNG), Core.SSAValue(79), :($(QuoteNode(Random.SamplerTrivial{Random.CloseOpen01{Float64},Float64}(Random.CloseOpen01{Float64}()))))))::Random.UnsafeView{Float64}
      #= line 83 =#
      $(Expr(:gc_preserve_end, Core.SSAValue(61)))
      # meta: pop locations (7)
      #= line 4 =#
      # meta: location /buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/Random.jl rand 224
      # meta: location /buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/Random.jl rand 236
      # meta: location /buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/Random.jl rand 235
      # meta: location boot.jl Type 397
      # meta: location boot.jl Type 389
      # meta: location boot.jl Type 380
      Core.SSAValue(109) = $(Expr(:foreigncall, :(:jl_alloc_array_1d), Array{Float64,1}, svec(Any, Int64), :(:ccall), 2, Array{Float64,1}, 5000, 5000))
      # meta: pop locations (3)
      # meta: location /buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/Random.jl rand! 214
      # meta: location /buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/RNGs.jl rand! 447
      # meta: location array.jl length 137
      Core.SSAValue(116) = (Base.arraylen)(Core.SSAValue(109))::Int64
      # meta: pop location
      # meta: location /buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/RNGs.jl _rand! 440
      # meta: location int.jl * 54
      Core.SSAValue(129) = (Base.mul_int)(8, Core.SSAValue(116))::Int64
      # meta: pop location
      # meta: location array.jl length 137
      Core.SSAValue(130) = (Base.arraylen)(Core.SSAValue(109))::Int64
      # meta: pop location
      # meta: location int.jl * 54
      Core.SSAValue(131) = (Base.mul_int)(8, Core.SSAValue(130))::Int64
      # meta: pop location
      # meta: location int.jl <= 419
      Core.SSAValue(132) = (Base.sle_int)(Core.SSAValue(129), Core.SSAValue(131))::Bool
      # meta: pop location
      unless Core.SSAValue(132) goto 88
      #temp#@_16::Bool = true
      goto 90
      88: 
      #temp#@_16::Bool = false
      90: 
      unless #temp#@_16::Bool goto 93
      goto 98
      93: 
      # meta: location boot.jl Type 281
      Core.SSAValue(134) = $(Expr(:new, :(Core.AssertionError), "sizeof(Float64) * n64 <= sizeof(T) * length(A) && isbits(T)"))
      # meta: pop location
      (Base.throw)(Core.SSAValue(134))::Union{}
      98: 
      #= line 441 =#
      # meta: location gcutils.jl
      #= line 81 =#
      Core.SSAValue(124) = $(Expr(:gc_preserve_begin, Core.SSAValue(109)))
      #= line 82 =#
      # meta: location abstractarray.jl pointer 911
      # meta: location pointer.jl unsafe_convert 65
      Core.SSAValue(137) = $(Expr(:foreigncall, :(:jl_array_ptr), Ptr{Float64}, svec(Any), :(:ccall), 1, Core.SSAValue(109)))
      # meta: pop locations (2)
      # meta: location /buildworker/worker/package_linux64/build/usr/share/julia/site/v0.7/Random/src/RNGs.jl Type 365
      Core.SSAValue(142) = $(Expr(:new, Random.UnsafeView{Float64}, Core.SSAValue(137), Core.SSAValue(116)))
      # meta: pop location
      $(Expr(:invoke, MethodInstance for rand!(::Random.MersenneTwister, ::Random.UnsafeView{Float64}, ::Random.SamplerTrivial{Random.CloseOpen01{Float64},Float64}), :(Random.rand!), :(Random.GLOBAL_RNG), Core.SSAValue(142), :($(QuoteNode(Random.SamplerTrivial{Random.CloseOpen01{Float64},Float64}(Random.CloseOpen01{Float64}()))))))::Random.UnsafeView{Float64}
      #= line 83 =#
      $(Expr(:gc_preserve_end, Core.SSAValue(124)))
      # meta: pop locations (7)
      #= line 5 =#
      # meta: location array.jl ones 398
      # meta: location array.jl ones 396
      # meta: location array.jl ones 395
      # meta: location boot.jl Type 389
      # meta: location boot.jl Type 380
      Core.SSAValue(170) = $(Expr(:foreigncall, :(:jl_alloc_array_1d), Array{Float64,1}, svec(Any, Int64), :(:ccall), 2, Array{Float64,1}, 5000, 5000))
      # meta: pop locations (2)
      Core.SSAValue(151) = $(Expr(:invoke, MethodInstance for fill!(::Array{Float64,1}, ::Float64), :(Base.fill!), Core.SSAValue(170), 1.0))::Array{Float64,1}
      # meta: pop locations (3)
      mn::Array{Float64,1} = $(Expr(:invoke, MethodInstance for *(::Array{Float64,1}, ::Int64), :(Main.:*), Core.SSAValue(151), 1000))::Array{Float64,1}
      #= line 6 =#
      #temp#@_6::Int64 = 1
      128: 
      # meta: location range.jl done 457
      # meta: location int.jl + 53
      Core.SSAValue(197) = (Base.add_int)(5000, 1)::Int64
      # meta: pop location
      # meta: location promotion.jl == 433
      Core.SSAValue(198) = (#temp#@_6::Int64 === Core.SSAValue(197))::Bool
      # meta: pop locations (2)
      Core.SSAValue(4) = (Base.not_int)(Core.SSAValue(198))::Bool
      unless Core.SSAValue(4) goto 193
      # meta: location range.jl next 456
      # meta: location int.jl + 53
      Core.SSAValue(203) = (Base.add_int)(#temp#@_6::Int64, 1)::Int64
      # meta: pop location
      Core.SSAValue(246) = #temp#@_6::Int64
      # meta: pop location
      #temp#@_6::Int64 = Core.SSAValue(203)
      #= line 6 =#
      #temp#@_8::Int64 = 1
      147: 
      # meta: location range.jl done 457
      # meta: location int.jl + 53
      Core.SSAValue(229) = (Base.add_int)(5000, 1)::Int64
      # meta: pop location
      # meta: location promotion.jl == 433
      Core.SSAValue(230) = (#temp#@_8::Int64 === Core.SSAValue(229))::Bool
      # meta: pop locations (2)
      Core.SSAValue(9) = (Base.not_int)(Core.SSAValue(230))::Bool
      unless Core.SSAValue(9) goto 191
      # meta: location range.jl next 456
      # meta: location int.jl + 53
      Core.SSAValue(235) = (Base.add_int)(#temp#@_8::Int64, 1)::Int64
      # meta: pop location
      Core.SSAValue(245) = #temp#@_8::Int64
      # meta: pop location
      #temp#@_8::Int64 = Core.SSAValue(235)
      #= line 7 =#
      # meta: location array.jl getindex 661
      Core.SSAValue(236) = (Base.arrayref)(true, Core.SSAValue(46), Core.SSAValue(245))::Float64
      # meta: pop location
      # meta: location array.jl getindex 661
      Core.SSAValue(237) = (Base.arrayref)(true, Core.SSAValue(109), Core.SSAValue(246))::Float64
      # meta: pop location
      # meta: location float.jl - 395
      Core.SSAValue(238) = (Base.sub_float)(Core.SSAValue(236), Core.SSAValue(237))::Float64
      # meta: pop location
      # meta: location float.jl abs 517
      Core.SSAValue(239) = (Base.abs_float)(Core.SSAValue(238))::Float64
      # meta: pop location
      #= line 9 =#
      # meta: location array.jl getindex 661
      Core.SSAValue(240) = (Base.arrayref)(true, mn::Array{Float64,1}, Core.SSAValue(246))::Float64
      # meta: pop location
      # meta: location float.jl < 450
      Core.SSAValue(241) = (Base.lt_float)(Core.SSAValue(239), Core.SSAValue(240))::Bool
      # meta: pop location
      unless Core.SSAValue(241) goto 189
      #= line 10 =#
      # meta: location array.jl setindex! 699
      (Base.arrayset)(true, mn::Array{Float64,1}, Core.SSAValue(239), Core.SSAValue(246))::Array{Float64,1}
      # meta: pop location
      189: 
      goto 147
      191: 
      goto 128
      193: 
      return
  end::Nothing