首页 > 解决方案 > Julia:如何查看去向量化的代码?

问题描述

我想在这里看到一些表达式的去向量化代码

obj.mask = exp.(1.0im*lambda*obj.dt/2.);

如何在 Julia 中以去向量化的形式打印通用表达式?

标签: julia

解决方案


我认为您要求的内容不存在(如果我错了,请证明我错了!)。

您能做的最好的事情是使用@code_lowered, @code_typed, @code_llvm, @code_native宏(特别是@code_lowered)来查看您的 Julia 代码片段会发生什么。但是,由于 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

并检查broadcast.jl第 1139 行等以跟踪broadcasted将被调用的实际方法(也许 Tim Holy 的Rebugger在这里很有用: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!好的,最终,我在in 中找到了 for 循环broadcast.jl。但这可能是深入兔子洞。


推荐阅读