Julia:如何查看去矢量化代码?



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

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

如何在 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                                                                                                            │
)

因此,朱莉娅将.*转化为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 的 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)

更新

好的,最终,我在broadcast.jlcopyto!中找到了for循环。但这大概是深入兔子洞

最新更新