如何衡量计算着色器的时间性能?

4
我需要测量计算着色器的时间。但是这当然不是一件简单的事情。
OpenGL Wiki - Performance上,我了解到在着色器调用之前和之后使用glFinish()很有用。但他们也说使用它并不是那么好。有没有好的方法来测量我的着色器的时间?有没有任何方式来测量计算着色器的时间?
我的代码看起来像这样:
renderloop()
{
  //(1)
  //(2)
  if(updateFunction) //this is done just one time at the beginning
  {
    //update Texture with a compute shader
    //...
    glDispatchCompute();
    glMemoryBarrier(GL_ALL_BARRIER_BITS);
  }
  //(3)
  //(1)

  //use the texture to do some marching cubes rendering
}

我猜我需要在位置(1)插入glFinish(),并在(2)开始计时器,在(3)停止它。但我不确定它是否真的有效并会产生正确的时间结果,因为参考文献中谈论了渲染,而计算着色器并非渲染,对吗?
OpenGL还有一个 Timer_Query ,但我不确定它如何工作,也不知道使用它是否有用。这对我来说是新东西,目前我不确定自己是否完全理解它。
来自 这里 的答案说,几乎不可能精确测量代码的一部分。最好的方法是测量帧渲染时间,但是我只需要计算着色器部分的帧渲染时间。
你认为最好的替代方法是什么?只测量整个帧渲染时间并将其用于我的目的?或者您使用其他测量方法获得更好的经验?
1个回答

7
计时查询绝对是正确的方法。
一般原则是创建“查询对象”,并将其插入到GL函数调用之间。
由于GPU是异步运行的,这些查询将被插入到GPU命令队列中,并在实际处理命令时进行“填充”。
因此,在您的情况下,您需要使用glGenQueries(1, &myQuery);创建一个查询。
然后,在(2)中开始查询,使用glBeginQuery(GL_TIME_ELAPSED, myQuery),并在(3)中停止查询,使用glEndQuery(GL_TIME_ELAPSED)
要获取结果,只需调用glGetQueryObject函数即可。
您可以在此处了解更多信息: http://www.lighthouse3d.com/tutorials/opengl-short-tutorials/opengl-timer-query/ 当然,存在一些“陷阱”-主要的是您必须等待计时结果准备就绪-因此,您可以等待GPU和CPU同步,这会减慢应用程序的速度(但仍会给出良好的GL计时),或者同时进行多个查询。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接