Что значит "доработать" в Юлии?

В настоящее время я работаю с пакетом CUDArt. Документация GitHub включает следующий фрагмент кода при загрузке модуля ptx, содержащего пользовательское ядро ​​CUDA C:

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

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

Я пытаюсь понять, что именно это false вариант для доработки средств и когда я бы / не хотел его использовать. Я наткнулся на этот пост на SO ( Как правильно написать метод финализации модуля на Юлии?). Цитирует из документации Юлии как:

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

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

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

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

2 ответа

Решение

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

Я не могу комментировать, но я хотел бы добавить это из документов :

finalizer(f, x)

fне должен вызывать переключение задач, что исключает большинство операций ввода-вывода, таких как println. С использованием @asyncмакрос (чтобы отложить переключение контекста за пределами финализатора) или ccall для прямого вызова функций ввода-вывода в C могут быть полезны для целей отладки.

Другие вопросы по тегам