为什么这个预编译示例在 Julia 中不起作用

jul*_*uls 3 julia

我目前正在尝试在 Julia 中对自定义包使用预编译。主要目标是预编译利用 StaticVectors 的函数。一般来说,我想使用抽象 Real 类型作为参数,然后预编译 2D 和 3D 向量。然而,预编译对于 Real 和 AbstractFloat 等抽象类型失败,而不是专门的 Float64,我很难理解为什么。

这是一个最小的工作示例,可以更好地展示问题和我所尝试的内容:

module MWE
using StaticArrays: SVector

function f(v::SVector{D, Real}, s::Real)::SVector{D, Real} where {D}
    s*v
end

println(
    "precomp for (SVector{3, Real}, Real   ,) ", precompile(f, (SVector{3, Real}, Real,))    ? " succeeded" : " failed", "\n",
    "precomp for (SVector{3, Real}, Float64,) ", precompile(f, (SVector{3, Real}, Float64,)) ? " succeeded" : " failed", "\n"
    )
end

#= REPL output after generating the package and adding StaticVectors to deps:

julia> using MWE
[ Info: Precompiling MWE [4a20f9fe-1107-468f-ad25-8011b995da74]
precomp for (SVector{3, Real}, Real   ,)  failed
precomp for (SVector{3, Real}, Float64,)  succeeded
=#
Run Code Online (Sandbox Code Playgroud)

我的猜测是预编译不适用于抽象类型,但是当使用 Real 作为 StaticVector 的参数时,它似乎工作得很好。同样,最初的目标是调用SVector{2, Real}, RealSVector{3, Real}, Real 的预编译函数,以在使用包时跳过一些 JIT 编译。

tho*_*oly 5

与此有关:

julia> isconcretetype(Real)
false

julia> isconcretetype(Vector{Real})
true
Run Code Online (Sandbox Code Playgroud)

虽然元素不是具体的,但容器本身是具体的。如果你了解 C,它的内部Vector{Real}是作为指针列表实现的void*,这是一种完全具体的容器类型。