Что значит "доработать" в Юлии?
В настоящее время я работаю с пакетом 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
когда этот аргумент недоступен для программы - как это вообще возможно? Таким образом, я был бы признателен за любую помощь в разъяснении:
- Что значит "доработать" в Юлии и
- Когда я хотел бы / не хотел бы использовать его в контексте импорта модулей.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 могут быть полезны для целей отладки.