2016-07-10 63 views
7

Attualmente sto lavorando con il pacchetto CUDArt. La GitHub documentation include il seguente frammento di codice quando si carica un modulo PTX contenente un kernel CUDA C personalizzato:Che cosa significa "finalizzare" in Julia?

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

(commento in originale)

Sto cercando di capire che cosa esattamente questa opzione false per mezzo finalizzazione e quando vorrei/non vorrei usarlo. Mi sono imbattuto in questo post su SO (What is the right way to write a module finalize method in Julia?). Si cita la documentazione Julia:

finalizzatore (x, funzione)

registrare una funzione f (x) di essere chiamato quando non ci sono riferimenti di programma accessibile a x. Il comportamento di questa funzione è imprevedibile se x è di tipo bit.

In realtà non capisco cosa significhi questo, o anche se la finalizzazione qui è la stessa di quella citata nell'esempio CUDArt. Ad esempio, non ha senso per me provare a chiamare una funzione su un argomento x quando quell'argomento non è accessibile al programma - come potrebbe essere anche possibile? Così, Gradirei qualsiasi aiuto a chiarire:

  1. Cosa significa "finalizzare" in Julia e
  2. Quando io/non vorrei usarlo nel contesto di importare .ptx moduli con CUDArt

risposta

5

non posso parlare per CUDArt, ma qui è quello che significa in finalize Julia: quando il garbage collector rileva che il programmanon è più in grado di accedere all'oggetto, allora verrà eseguito il finalizzatore, e poi raccogliere (libero) l'oggetto. Si noti che il garbage collector può ancora accedere all'oggetto, anche se il programma non può.

Ecco un esempio:

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 

Questo è utile in modo che le risorse esterne (come le maniglie di file o malloc memoria ndr) vengono liberati se un oggetto viene raccolto.

+1

È inoltre possibile eseguire manualmente il finalizzatore. con 'finalize (X)' –