美文网首页
What is the difference between @

What is the difference between @

作者: 昵称违法 | 来源:发表于2021-08-19 07:10 被阅读0次

What is the difference between @code_native, @code_typed and @code_llvm in Julia?

julia - 使用 @code_lowered 是解决 Julia 性能问题的有效方法吗?

原文 标签 julia

以下为部分摘文:

@code_lowered 对理解性能没有帮助。@code_warntype 是最好的。

基本上是不同的步骤:

解析:

源代码 -> 抽象语法树(就像用宏操作的那样),循环和条件等块是树中的分支。
您可以通过引用源代码来查看它。

quote
if x>1
x=x-1
end
end

降低:

抽象句法树 -> 降低中间表示(IR),我认为最好将其描述为抽象句法列表,

基本上没有做任何事情,没有优化等。
只是树形变成了一个没有子表达式的列表,每个临时都在它自己的行上。循环和 ifs 变成各种跳转(如标签和条件跳转)

一些东西变成了降低的表示,比如 end 中的 xs[end-1] 变成了 lastindex(xs)
这种降低可以完全提前完成,它不需要 JIT。
它只是语法的转换

您可以通过 @code_lowered f(x) 访问它以获取一些带有参数 f 的函数 x 。
或者如果您有 Method ,那么您可以执行 Base.uncompressed_ast(method) 。

特化

使用类型信息并运行优化器。
事物被内联,总是为真或假的条件被删除(例如检查类型)。
降低的 IR 变为 Typed IR。
@code_typed f(x) 帮你搞定。
@code_typed optimize=false f(x) 无需运行优化步骤即可获得此功能。
@code_warntype f(x) 为您提供额外有用的性能注释,突出显示类型不稳定性

这是最有用的层之一。
可能仅次于源代码本身。

代码生成 (LLVM)

这就是我们 Typed IR 变成 LLVM 的地方。
LLVM 在内部就像一堆中间表示一样。
LLVM 自己做了大量优化。
例如各种数学内在常数在这个阶段传播。

通过 @code_llvm f(x) 访问

这是 Typed 之后的下一个最有用的阶段。
(与 native 机器代码绑定(bind),取决于您是否比汇编更好或更差地阅读 LLVM IR)。

代码生成(汇编)

LLVM 变成了组装,
基本上是人类可读的机器代码。
通过 @code_native f(x) 访问

之后只有假设,到机器代码。
虽然我怀疑该程序集通常会被绕过,因为它们是 1-1 直接从 LLVM 到机器代码。

相关文章

网友评论

      本文标题:What is the difference between @

      本文链接:https://www.haomeiwen.com/subject/nakobltx.html