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循环中实现相同的操作。是否可以通过执行此类自省/代码生成?是否可以通过执行此类自省/代码生成?