這甚至可能嗎?OpenGL:如何獲得GPU使用百分比?
回答
我從來沒有見過類似的東西。通常情況下,您儘可能快地渲染幀,然後執行一些CPU幀後處理或預處理並渲染下一幀,所以使用率在0到100%之間。只有很少的FPS被限制在最大數量,只有在這種情況下,這將是一個有意義的數字。
沒有。在這種高度並行的環境中,很難嚴格定義。但是,您可以用ARB_timer_query擴展名來近似它。
可以舉例說明使用ARB_timer_query擴展嗎? – Newbie 2010-10-06 19:37:31
並非如此,但您可以使用供應商的實用程序獲得不同的性能計數器,對於NVIDIA,您可以使用NVPerfKit和NVPerfHUD。其他廠商也有類似的實用程序
我在我的OpenGL渲染線程實現中實現了基於GPU執行時間測量框架的定時器查詢。我給大家介紹下面的計時器查詢部分:
假設
enqueue
運行渲染線程limiter.frame60
上的功能僅相當於0每隔60幀
代碼:
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();
}
}
下面是一些例子輸出:
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
這讓我打電話給renderThread->beginTimerQuery("draw some text");
在我的OpenGL繪圖調用或什麼的, renderThread->endTimerQuery();
之後,測量已經過的GPU執行時間。
這裏的想法是,它在測量部分之前向GPU命令隊列發出命令,因此glBeginQuery
TIME_ELAPSED
記錄了某個實現定義的計數器的值。 glEndQuery
發出GPU命令來存儲當前計數和TIME_ELAPSED
查詢開頭存儲的計數之間的差異。該結果由GPU存儲在查詢對象中,並且在將來某個異步時間「可用」。我的代碼保持一個已發佈的定時器查詢的隊列,並且每秒檢查一次完成的測量。只要隊列頭部的定時器查詢仍然可用,我的dumpTimerQueue
就會一直打印測量結果。最終它會觸發一個尚未提供的計時器並停止打印消息。
我添加了一個額外的功能,它將60個調用中的59個調出到測量功能,所以它只對我的程序中的所有儀器每秒測量一次。這可以防止太多的垃圾郵件,並使其可用於轉儲到stdout進行開發,並防止由測量引起的太多性能干擾。這就是limiter.frame60的東西,frame60保證是< 60.它包裝。
雖然這並不能完全回答問題,但您可以通過記錄所有繪製調用的經過時間與經過的掛鐘時間來推斷GPU使用情況。如果幀是16ms,並且定時器查詢TIME_ELAPSED是8ms,則可以推斷大約50%的GPU使用率。
還有一點需要注意:測量是通過將GPU命令放入GPU隊列中來度量GPU執行時間。線程與它無關,如果這些enqueue
內部的操作在一個線程中執行,它將是等效的。
- 1. Cuda獲取GPU負載百分比
- 2. 如何在sql中獲得百分比?
- 3. SpotFire - 如何獲得累積百分比
- 4. 如何獲得相似度百分比?
- 5. 如何獲得百分比值
- 6. 以編程方式獲得OS X中GPU的使用率百分比
- 7. 如何使用MDX獲取百分比
- 8. 如何使用ExoPlayer獲得緩衝百分比更新?
- 9. 如何以百分比獲得使用的RAM?
- 10. 如何獲得在InfluxDB收集的CPU使用百分比
- 11. 如何使用libfacerec獲得相似百分比Opencv庫
- 12. 比較行並獲得百分比
- 13. 如何直接從MySQL查詢中獲得兩個百分比的百分比?
- 14. JS中的數學 - 如何從百分比中獲得比率
- 15. 獲得百分比使用直方圖磨製使用時
- 16. 如何獲得執行Selenium測試用例的百分比
- 17. 如何在C++中使用Sigar庫獲得CPU使用率百分比
- 18. 獲得組內計數和百分比
- 19. 從csv獲得最大百分比
- 20. Weka - 獲得「準確度百分比」?
- 21. 獲得參加人數的百分比
- 22. 使用累計匯率/應用百分比獲得計算值
- 23. 用jquery獲取百分比
- 24. 百分比使用情況如何?
- 25. 獲取CPU使用百分比
- 26. 使用UITextField通過計算獲得百分比(Swift 2.0)
- 27. 使用if語句來獲得輸入的百分比?
- 28. 使用graphviz和d3生成餅圖時獲得百分比DAG
- 29. 獲得驅動器使用空間的百分比
- 30. 如何在oracle中獲取百分比?
我從來沒有在任何地方看過這個參數。 – Andrey 2010-09-23 12:16:25