2015-04-30 13 views
5

Ho pensato di averlo capito ma a quanto pare non lo faccio :) Devo eseguire la codifica di stream H.264 parallela con NVENC da frame che non sono in nessuno dei formati accettati dall'encoder, quindi ho una pipeline di codice seguente :Più contesti CUDA per un dispositivo - qualsiasi senso?

  • un callback informa che un nuovo frame è arrivato è chiamato
  • copiano la cornice memoria CUDA ed eseguire la conversione spazio colore richieste (solo il primo cuMemcpy è sincrona, così posso restituire la richiamata , tutte le operazioni in sospeso vengono inserite in un flusso dedicato)
  • Spingo un evento nello stream e ho un altro thread che lo aspetta, un Appena impostato, prendo il puntatore di memoria CUDA con la cornice nello spazio colore corretto e lo alimento al decoder

Per qualche motivo ho avuto l'assunto che ho bisogno di un contesto dedicato per ogni thread se io eseguire questa pipeline in thread paralleli. Il codice era lento e dopo alcune letture ho capito che il cambio di contesto è in realtà costoso, e quindi sono giunto alla conclusione che non ha senso dato che in un contesto possiede l'intera GPU, quindi blocco qualsiasi elaborazione parallela da altri thread del transcoder .

Domanda 1: In questo scenario, sto bene utilizzando un singolo contesto e uno stream esplicito creato in questo contesto per ogni thread che esegue la pipeline menzionata?

Domanda 2: Qualcuno può illuminarmi su quale sia l'unico scopo del contesto del dispositivo CUDA? Immagino che abbia senso in uno scenario con più GPU, ma ci sono dei casi in cui vorrei creare più contesti per una GPU?

+0

cos'è NVCENC? Ho sentito parlare di NVENC e NVCUVENC. –

+0

@RobertCrovella, il mio NVENC male scritto male. –

risposta

9

Domanda 1: In questo scenario, sto bene utilizzando un singolo contesto e uno stream esplicito creato in questo contesto per ogni thread che esegue la pipeline menzionata?

Si dovrebbe andare bene con un unico contesto.

Domanda 2: Qualcuno può illuminarmi su quale sia l'unico scopo del contesto del dispositivo CUDA? Immagino che abbia senso in uno scenario con più GPU, ma ci sono dei casi in cui vorrei creare più contesti per una GPU?

Il contesto del dispositivo CUDA è discusso in the programming guide. Rappresenta tutto lo stato (mappa della memoria, allocazioni, definizioni del kernel e altre informazioni relative allo stato) associate a un particolare processo (cioè associato a quell'uso particolare di una GPU). I processi separati avranno normalmente contesti separati (come separeranno i dispositivi), poiché questi processi hanno un utilizzo indipendente della GPU e mappe di memoria indipendenti.

Se si utilizza più processi di una GPU, in genere si generano più contesti su quella GPU. Come hai scoperto, è possibile creare più contesti da un singolo processo, ma di solito non è necessario.

E sì, quando si hanno più contesti, i kernel lanciati in quei contesti richiedono il cambio di contesto per passare da un kernel in un contesto a un altro kernel in un altro contesto. Quei kernel non possono essere eseguiti contemporaneamente.

L'utilizzo dell'API di runtime CUDA gestisce i contesti per voi.Normalmente non interagisci esplicitamente con un contesto CUDA quando usi l'API runtime. Tuttavia, nell'utilizzo dell'API del driver, il contesto viene creato e gestito in modo esplicito.

+0

grazie mille per la risposta :) –

+0

Quando si dice che più contesti non possono essere eseguiti contemporaneamente, è limitato al solo avvio del kernel o si riferisce anche ai trasferimenti di memoria? Ho considerato un design multiprocesso tutto sulla stessa GPU che utilizza l'API IPC per trasferire i buffer da un processo all'altro. Questo significa che in modo efficace, solo un processo alla volta ha accesso esclusivo all'intera GPU (non solo a particolari SM)? Non è un assassino per il mio design, ma è deludente. In che modo interagisce con i kernel/le copie in coda in modo asincrono sui flussi in ogni processo fino alla pianificazione? –

+0

Per quanto riguarda la tua prima domanda, ho pensato che il penultimo paragrafo della mia risposta rendesse abbastanza chiaro che stavo parlando di kernel concorrenti, ma ho apportato una leggera modifica per rimuovere i dubbi. Per quanto riguarda il resto, ti suggerisco di porre una nuova domanda. Non è pratico approfondire questi argomenti nello spazio dei commenti. –

Problemi correlati