7

我目前正在使用 CUDArt 包。GitHub文档在加载包含自定义 CUDA C 内核的 ptx 模块时包含以下代码片段:

md = CuModule("mycudamodule.ptx", false)  # false means it will not be automatically finalized

(评论原文)

我试图了解这个false最终确定选项的确切含义以及我何时/不想使用它。我在 SO 上看到了这篇文章(在 Julia 中编写模块完成方法的正确方法是什么?)。它从 Julia 文档中引用为:

终结器(x,函数)

注册一个函数 f(x) 以在没有程序可访问的 x 引用时调用。如果 x 是位类型,则此函数的行为是不可预测的。

不过,我真的不明白这意味着什么,甚至这里的最终确定是否与 CUDArt 示例中提到的相同。例如,x当程序无法访问参数时,尝试在参数上调用函数对我来说是没有意义的——这怎么可能呢?因此,我将不胜感激任何帮助澄清:

  1. 在 Julia 中“敲定”是什么意思?
  2. 当我想/不想在使用 CUDArt 导入 .ptx 模块的上下文中使用它时
4

2 回答 2

6

我不能代表 CUDArt,但这是finalizeJulia 中的意思:当垃圾收集器检测到程序无法再访问对象时,它将运行终结器,然后收集(释放)对象。请注意,垃圾收集器仍然可以访问该对象,即使程序不能。

这是一个例子:

julia> type X
           a
       end
julia> j = X(1)  # create new X(1) object, accessible as j
julia> finalizer(j, println)  # print the object when it's finalized
julia> gc()      # suggest garbage collection; nothing happens
julia> j = 0     # now the original object is no longer accessible by the program
julia> gc()      # suggest carbage collection
X(1)             # object was collected... and finalizer was run

malloc这很有用,以便在收集对象时释放外部资源(例如文件句柄或ed 内存)。

于 2016-07-10T17:05:37.130 回答
0

我无法发表评论,但我想从docs中添加:

finalizer(f, x)

f不能导致任务切换,这排除了大多数 I/O 操作,例如 println。使用@async宏(将上下文切换推迟到终结器之外)或 ccall 直接调用 C 中的 IO 函数可能有助于调试目的。

于 2021-01-26T17:12:26.183 回答