2016-07-10 7 views
7

В настоящее время я работаю с пакетом CUDArt. GitHub documentation включает следующий фрагмент кода при загрузке модуля PTX, содержащий пользовательские CUDA C ядро:Что значит «финализировать» в Джулии?

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

(комментарий в оригинале)

Я пытаюсь понять, что именно этот false варианта для завершения средств и когда я/не хотел бы использовать его. Я наткнулся на этот пост на SO (What is the right way to write a module finalize method in Julia?). Он цитирует Джулии документации как:

финализации (х, функция)

зарегистрировать функцию F (X), которая будет вызвана, когда нет программы доступных ссылок на х. Поведение этой функции непредсказуемо, если x имеет битовый тип.

Я действительно не понимаю, что это значит, или даже если финализация здесь такая же, как и в примере CUDArt. Например, мне не имеет смысла пытаться вызвать функцию по аргументу x, когда этот аргумент недоступен для программы - как это возможно? Таким образом, я был бы признателен за любую помощь в разъяснении:

  1. Что значит «завершить» в Джулию и
  2. Когда я/не хотел бы использовать его в контексте импорта .ptx модулей с CUDArt

ответ

5

Я не могу говорить за CUDArt, но вот что finalize означает Джулии: когда сборщик мусора обнаруживает, что программа больше не может получить доступ к объекту, то он будет работать финализатор, а затем собрать (бесплатно) объект. Обратите внимание, что сборщик мусора может получить доступ к объекту, даже если программа не может.

Вот пример:

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 эд памяти) освобождаются, если объект убирается.

+1

Вы также можете вручную запустить финализатор. с 'finalize (X)' –