2012-09-22 12 views
7

La mia domanda è proprio come il titolo. In realtà, sto cercando un modo per liberare la memoria del dispositivo in modo asincrono.È cudaFree() asincrono?

Grazie!

risposta

7

cudaFree() non è asincrono. Una chiamata di sincronizzazione viene chiamata internamente quando viene chiamato un cudaFree() dall'host.

Non ho capito quale sia il tuo bisogno di liberare memoria in modo asincrono.

+4

Immaginate una pipeline di lanci di kernel dipendenti, alcuni che richiedono allocazioni temporanee. Sarebbe bello se il thread host potesse inserire in modo asincrono 'cudaMalloc's e' cudaFree's in una tale pipeline. –

+1

In caso di grossi problemi, è possibile utilizzare la memoria di liberazione asincrona per creare spazio per altri flussi. In altre parole, sarete in grado di gestire grossi problemi con molti flussi all'interno di una singola GPU. –

5

cudaFree() è sincrono. Se si desidera realmente che sia asincrono, è possibile creare il proprio thread della CPU, assegnargli una coda di lavoro e registrare le richieste cudaFree dal thread primario.

Detto questo, il libero asincrono sembra una richiesta dispari. Forse potresti spiegare perché ti piacerebbe che fosse asincrono. Vuoi che il libero si verifichi immediatamente dopo l'attivazione di un evento CUDA?

+0

Frees degli stream CUDA e degli eventi CUDA sono stati resi asincroni dalla loro introduzione, proprio perché alcune applicazioni hanno subroutine che li usano, e c'è il desiderio che quelle subroutine non causino la sincronizzazione dei loro percorsi di codice dei chiamanti. Asincrono libero è una richiesta totalmente ragionevole, per lo stesso motivo. CUDA può contrassegnare in modo asincrono la memoria come libera e, se deve sincronizzarsi con la GPU per modificare le tabelle delle pagine, eseguire pigramente tali operazioni (attendere fino al successivo thunk del kernel). – ArchaeaSoftware

+0

@Archaea: è interessante. Penso che il poster sia anche interessato a liberare memoria, non solo gli oggetti cudaEvent_t. Come si associa un cudaFree ad un evento o stream? –

+1

Mr. Fooz, la tua risposta è corretta (cioè AFAIK cudaFree() è sincrono), sto semplicemente sottolineando che è ragionevole volere che sia asincrono. – ArchaeaSoftware