risposta
Non ho mai visto niente del genere. Normalmente si esegue il rendering di un frame il più velocemente possibile, con alcuni frame CPU o pre-elaborazione e il rendering successivo, quindi i flap di utilizzo vanno da 0 a 100%. Solo raramente gli FPS sono limitati a un numero massimo e solo in questo caso questo sarebbe un numero significativo.
No. È persino difficile definire rigorosamente in un ambiente così parallelo. Tuttavia puoi approssimarlo con l'estensione ARB_timer_query.
potresti dare un esempio di utilizzo dell'estensione ARB_timer_query? – Newbie
Non proprio, ma è possibile ottenere contatori delle prestazioni diversi utilizzando le utilità del fornitore, per NVIDIA si dispone di NVPerfKit e NVPerfHUD. Altri venditori hanno utility simili.
Ho implementato un framework di misurazione del tempo di esecuzione della GPU basato su query con timer nella mia implementazione del thread di rendering OpenGL. Io condividere le parti di query timer di seguito:
Assumere
enqueue
esegue una funzione sul thread di renderinglimiter.frame60
è solo uguale a 0, una volta ogni 60 fotogrammi
Codice:
struct TimerQuery
{
std::string description;
GLuint timer;
};
typedef std::deque<TimerQuery> TimerQueryQueue;
...
TimerQueryQueue timerQueryQueue;
...
void GlfwThread::beginTimerQuery(std::string description)
{
if (limiter.frame60 != 0)
return;
enqueue([this](std::string const& description) {
GLuint id;
glGenQueries(1, &id);
timerQueryQueue.push_back({ description, id });
glBeginQuery(GL_TIME_ELAPSED, id);
}, std::move(description));
}
void GlfwThread::endTimerQuery()
{
if (limiter.frame60 != 0)
return;
enqueue([this]{
glEndQuery(GL_TIME_ELAPSED);
});
}
void GlfwThread::dumpTimerQueries()
{
while (!timerQueryQueue.empty())
{
TimerQuery& next = timerQueryQueue.front();
int isAvailable = GL_FALSE;
glGetQueryObjectiv(next.timer,
GL_QUERY_RESULT_AVAILABLE,
&isAvailable);
if (!isAvailable)
return;
GLuint64 ns;
glGetQueryObjectui64v(next.timer, GL_QUERY_RESULT, &ns);
DebugMessage("timer: ",
next.description, " ",
std::fixed,
std::setprecision(3), std::setw(8),
ns/1000.0, Stopwatch::microsecText);
glDeleteQueries(1, &next.timer);
timerQueryQueue.pop_front();
}
}
Ecco alcuni esempio di output:
Framerate t=5.14 fps=59.94 fps_err=-0.00 aet=2850.67μs adt=13832.33μs alt=0.00μs cpu_usage=17%
instanceCount=20301 parallel_μs=2809
timer: text upload range 0.000μs
timer: clear and bind 95.200μs
timer: upload 1.056μs
timer: draw setup 1.056μs
timer: draw 281.568μs
timer: draw cleanup 1.024μs
timer: renderGlyphs 1.056μs
Framerate t=6.14 fps=59.94 fps_err=0.00 aet=2984.55μs adt=13698.45μs alt=0.00μs cpu_usage=17%
instanceCount=20361 parallel_μs=2731
timer: text upload range 0.000μs
timer: clear and bind 95.232μs
timer: upload 1.056μs
timer: draw setup 1.024μs
timer: draw 277.536μs
timer: draw cleanup 1.056μs
timer: renderGlyphs 1.024μs
Framerate t=7.14 fps=59.94 fps_err=-0.00 aet=3007.05μs adt=13675.95μs alt=0.00μs cpu_usage=18%
instanceCount=20421 parallel_μs=2800
timer: text upload range 0.000μs
timer: clear and bind 95.232μs
timer: upload 1.056μs
timer: draw setup 1.056μs
timer: draw 281.632μs
timer: draw cleanup 1.024μs
timer: renderGlyphs 1.056μs
Questo mi permette di chiamare renderThread->beginTimerQuery("draw some text");
davanti ai miei opengl disegnano chiamate o qualsiasi altra cosa, e renderThread->endTimerQuery();
subito dopo, per misurare il tempo di esecuzione della GPU trascorso.
L'idea qui è che invia un comando alla coda di comando GPU proprio prima della sezione misurata, quindi glBeginQuery
TIME_ELAPSED
registra il valore di un contatore definito dall'implementazione. Il glEndQuery
emette un comando GPU per memorizzare la differenza tra il conteggio corrente e quello memorizzato all'inizio della query TIME_ELAPSED
. Tale risultato viene memorizzato dalla GPU nell'oggetto query ed è "disponibile" in un momento futuro asincrono. Il mio codice mantiene una coda di query temporizzate emesse e controlla una volta al secondo per le misurazioni completate. Il mio dumpTimerQueue
continua a stampare le misurazioni finché la query del timer all'inizio della coda è ancora disponibile. Alla fine colpisce un timer che non è ancora disponibile e interrompe la stampa dei messaggi.
Ho aggiunto una funzione aggiuntiva che elimina 59 chiamate su 60 per le funzioni di misurazione, quindi misura solo una volta al secondo per tutta la strumentazione nel mio programma. Questo impedisce troppi spam e lo rende utilizzabile per eseguire lo stdout per lo sviluppo e impedisce troppe interferenze prestazionali causate dalle misurazioni. Questo è ciò che è la cosa limiter.frame60, frame60 è garantito per essere < 60. Si avvolge.
Mentre questo non risponde perfettamente alla domanda, è possibile dedurre l'utilizzo della GPU notando il tempo trascorso per tutte le chiamate di prelievo rispetto al tempo di orologio a muro trascorso. Se il frame era 16ms e la query del timer TIME_ELAPSED era 8ms, è possibile dedurre circa il 50% di utilizzo della GPU.
Un'altra nota: la misurazione viene misurata durante l'esecuzione della GPU, inserendo i comandi GPU nella coda GPU. Il threading non ha nulla a che fare con esso, se le operazioni all'interno di quelle enqueue
fossero eseguite in un thread sarebbe equivalente.
- 1. Utilizzo progressivo della memoria della GPU
- 2. Come ottenere la percentuale di utilizzo della CPU del sistema operativo da java
- 3. Pulitura memoria GPU OpenGL, richiesta?
- 4. Get Docker Contenitore di utilizzo della CPU come percentuale
- 5. Utilizzo della GPU su Silverlight 5 per la matematica generica
- 6. Utilizza in modo programmatico la percentuale della GPU in OS X
- 7. Utilizzo di più GPU CUDA
- 8. utilizzo di base multi-GPU
- 9. Come posso leggere la carica della GPU?
- 10. Come verificare la conformità della versione OpenGL?
- 11. In che modo OpenGL comunica con la GPU?
- 12. Come gestire la limitazione della memoria della GPU per l'elaborazione di immagini ad alta risoluzione su GPU?
- 13. Node.js ottiene l'effettivo utilizzo della memoria in percentuale
- 14. Ottenere Theano per usare la GPU
- 15. TensorFlow - Basso utilizzo della GPU su Titan X
- 16. Utilizzo della GPU per accelerare i calcoli BigInteger
- 17. Utilizzo memoria video OpenGL
- 18. Utilizzo di numeri casuali con GPU
- 19. Come si accede ai dati della trama sulla GPU in OpenGL?
- 20. Recupero programmato dell'utilizzo della GPU
- 21. Ottieni la quantità totale di memoria della GPU?
- 22. La percentuale di distribuzione della versione iOS più recente?
- 23. Calcolo della percentuale di avanzamento
- 24. Utilizzo di OpenGl con C#?
- 25. Utilizzo di OpenGL da Go
- 26. Utilizzo di una GPU come scheda video e GPGPU
- 27. Come si calcola il carico su una scheda gpu di nvidia (compatibile con cuda)?
- 28. Oracle: come ottenere la percentuale del totale da una query?
- 29. bash: ottenere la percentuale da una tabella di frequenza
- 30. Calcolo della percentuale di conteggio gruppi (*)
Non ho mai visto questo parametro misurato da nessuna parte. – Andrey