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

Dan*_*gel 4 c++ opengl performance compute-shader

我需要测量计算着色器的时间.但当然这不是微不足道的.从OpenGL Wiki -我得到的性能,在着色器调用之前和之后使用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
}
Run Code Online (Sandbox Code Playgroud)

我想我必须插入glFinish()位置(1)并启动计时器(2)并将其停在(3).但我不确定它是否真的有效并且会产生正确的计时结果,因为在参考中他们谈论的是渲染而计算着色器不能渲染,不是吗?

还存在OpenGL Timer_Query,但我不确定它是如何工作的,也不知道它是否对我有用.这些东西对我来说是新的,我不确定我是否完全理解它.

这里的答案说,几乎不可能精确地测量代码的一部分.最好的方法是测量帧渲染时间,但我只需要帧渲染时间的计算着色器部分用于我的目的.

您认为最好的替代方案是什么?只测量整个帧渲染时间并使用它?或者您是否使用其他测量方法获得了更好的体验?

rot*_*lup 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时间),或在飞行中有多个查询.