jit友好的julia代码有什么特征?

如题
比如使用typeof(v) === t是否导致jit受阻?

是在普通的function里用,还是在@generated function里?

类型会不断改变的代码基本都是JIT不友好的Julia代码吧。

话说这个@generated function里面变量直接就是type的吧,和他说的应该不是一个问题,不过如果如要做typeof的判断的时候用个@generated function应该算是个好选择(语义受限,不一定都好改)。

2 个赞

普通函数。generated function要手动抓闭包才能用,不适合做代码生成。我目的是做通用的代码生成来着。。

可以用 @code_warntype 来检查。比如说

julia> foo(::Type{Val{1}}) = 1; foo(::Type{Val{2}}) = 2;

julia> goo(n) = foo(Val{n})
goo (generic function with 1 method)

julia> @code_warntype foo(Val{1})
Body::Int64
1 1 ─     return 1                                                                                                                                          │

julia> @code_warntype goo(1)
Body::Int64
1 1 ─ %1  = (Core.apply_type)(Main.Val, n)::Type{Val{_1}} where _1                                                                                          │
  │   %2  = (isa)(%1, Type{Val{1}})::Bool                                                                                                                   │
  └──       goto #3 if not %2                                                                                                                               │
  2 ─       goto #6                                                                                                                                         │
  3 ─ %5  = (isa)(%1, Type{Val{2}})::Bool                                                                                                                   │
  └──       goto #5 if not %5                                                                                                                               │
  4 ─       goto #6                                                                                                                                         │
  5 ─ %8  = (Main.foo)(%1)::Int64                                                                                                                           │
  └──       goto #6                                                                                                                                         │
  6 ┄ %10 = φ (#2 => 1, #4 => 2, #5 => %8)::Int64                                                                                                           │
  └──       return %10                                                                                                                                      │


这里Julia编译器不可能知道 goo 里面的 foo 会接受到什么数据类型,所以“JIT不友好”。每次调用 goo Julia都会找应该用 foo 的哪个method。(如下)如果你看到类似于 ::Type{Val{_1}} where _1 或者在 @code_warntype 中显示出红色。那么就是“JIT不友好”。

julia> methods(foo)
# 2 methods for generic function "foo":
[1] foo(::Type{Val{1}}) in Main at REPL[1]:1
[2] foo(::Type{Val{2}}) in Main at REPL[1]:1
4 个赞

很好, 赞, nice(凑齐八字