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?
cos'è NVCENC? Ho sentito parlare di NVENC e NVCUVENC. –
@RobertCrovella, il mio NVENC male scritto male. –