Julia 朱莉娅:如何查看已开发的代码?
我希望看到一些表达式的已开发代码Julia 朱莉娅:如何查看已开发的代码?,julia,Julia,我希望看到一些表达式的已开发代码 如何在Julia中打印出一个devectorized形式的泛型表达式?我认为你所要求的并不存在(如果我错了,请证明我错了!) 您最好使用@code\u lowered、@code\u typed、@code\u llvm、@code\u native宏(特别是@code\u lowered)来查看您的代码段发生了什么。但是,由于Julia没有在内部将所有点转换为显式for循环,因此这些代码片段中的任何一个都将向您显示代码的for循环版本 例如: julia>
如何在Julia中打印出一个devectorized形式的泛型表达式?我认为你所要求的并不存在(如果我错了,请证明我错了!) 您最好使用
@code\u lowered、@code\u typed、@code\u llvm、@code\u native
宏(特别是@code\u lowered
)来查看您的代码段发生了什么。但是,由于Julia没有在内部将所有点转换为显式for循环,因此这些代码片段中的任何一个都将向您显示代码的for循环版本
例如:
julia> a,b = rand(3), rand(3);
julia> f(a,b) = a.*b
f (generic function with 1 method)
julia> @code_lowered f(a,b)
CodeInfo(
1 1 ─ %1 = Base.Broadcast.materialize │
│ %2 = Base.Broadcast.broadcasted │
│ %3 = (%2)(Main.:*, a, b) │
│ %4 = (%1)(%3) │
└── return %4 │
)
因此,Julia将*
转换为Base.Broadcast.broadcasted
调用。当然,我们可以走得更远,做得更好
julia> @which Base.Broadcast.broadcasted(Main.:*, a, b)
broadcasted(f, arg1, arg2, args...) in Base.Broadcast at broadcast.jl:1139
并检查第1139行中的broadcast.jl
,依此类推,以跟踪将被调用的实际broadcasted
方法(可能Tim Holy的方法在这里很有用:D)。但正如我之前所说,它不会有for循环。相反,您会发现如下内容:
broadcasted(::DefaultArrayStyle{1}, ::typeof(*), r::AbstractRange, x::Number) = range(first(r)*x, step=step(r)*x, length=length(r))
broadcasted(::DefaultArrayStyle{1}, ::typeof(*), r::StepRangeLen{T}, x::Number) where {T} =
StepRangeLen{typeof(T(r.ref)*x)}(r.ref*x, r.step*x, length(r), r.offset)
broadcasted(::DefaultArrayStyle{1}, ::typeof(*), r::LinRange, x::Number) = LinRange(r.start * x, r.stop * x, r.len)
更新
好的,最终,我在
copyto中找到了for循环代码>在broadcast.jl
中。但这可能是深入兔子洞。我不认为你所要求的存在(如果我错了,请证明我错了!)
您最好使用@code\u lowered、@code\u typed、@code\u llvm、@code\u native
宏(特别是@code\u lowered
)来查看您的代码段发生了什么。但是,由于Julia没有在内部将所有点转换为显式for循环,因此这些代码片段中的任何一个都将向您显示代码的for循环版本
例如:
julia> a,b = rand(3), rand(3);
julia> f(a,b) = a.*b
f (generic function with 1 method)
julia> @code_lowered f(a,b)
CodeInfo(
1 1 ─ %1 = Base.Broadcast.materialize │
│ %2 = Base.Broadcast.broadcasted │
│ %3 = (%2)(Main.:*, a, b) │
│ %4 = (%1)(%3) │
└── return %4 │
)
因此,Julia将*
转换为Base.Broadcast.broadcasted
调用。当然,我们可以走得更远,做得更好
julia> @which Base.Broadcast.broadcasted(Main.:*, a, b)
broadcasted(f, arg1, arg2, args...) in Base.Broadcast at broadcast.jl:1139
并检查第1139行中的broadcast.jl
,依此类推,以跟踪将被调用的实际broadcasted
方法(可能Tim Holy的方法在这里很有用:D)。但正如我之前所说,它不会有for循环。相反,您会发现如下内容:
broadcasted(::DefaultArrayStyle{1}, ::typeof(*), r::AbstractRange, x::Number) = range(first(r)*x, step=step(r)*x, length=length(r))
broadcasted(::DefaultArrayStyle{1}, ::typeof(*), r::StepRangeLen{T}, x::Number) where {T} =
StepRangeLen{typeof(T(r.ref)*x)}(r.ref*x, r.step*x, length(r), r.offset)
broadcasted(::DefaultArrayStyle{1}, ::typeof(*), r::LinRange, x::Number) = LinRange(r.start * x, r.stop * x, r.len)
更新
好的,最终,我在copyto中找到了for循环代码>在broadcast.jl
中。但这可能是深入兔子洞。当你说“devectorized form”时,你是指在(比如)一个for
循环中实现相同操作的有效Julia代码吗?或者,您是指CPU将运行的实际汇编代码,作为宏的输出?@AhmedFasih:Julia代码在(比如)for循环中实现相同的操作当您说“devectorized form”时,您是指在(比如)for
循环中实现相同操作的有效Julia代码吗?或者您是指CPU将运行的实际汇编代码,作为宏的输出?@AhmedFasih:Julia代码,它在(比如)for循环中实现相同的操作。是否可以通过执行此类自省/代码生成?是否可以通过执行此类自省/代码生成?