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

时间:2015-01-27 16:46:37

标签: c++ performance opengl compute-shader

我需要测量计算着色器的时间。但当然这不是微不足道的。 从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
}

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

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

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

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

1 个答案:

答案 0 :(得分:6)

计时器查询肯定是要走的路。

一般原则是您创建在GL函数调用之间插入的“查询对象”。

当GPU异步运行时,这些查询将插入GPU命令队列中,并在命令真正处理后“填充”。

因此,在您的情况下,您需要使用glGenQueries(1, &myQuery);

创建查询

然后,您不是启动计时器,而是使用glBeginQuery(GL_TIME_ELAPSED, myQuery)在(2)中启动查询,并使用glEndQuery(GL_TIME_ELAPSED)在(3)中“停止”。

要获得结果,您只需拨打glGetQueryObject功能。

您可以在此处了解更多信息,例如:http://www.lighthouse3d.com/tutorials/opengl-short-tutorials/opengl-timer-query/

当然,有一些'陷阱' - 主要的是你必须等待时间结果准备就绪 - 所以你可以选择GPU& CPU要同步,这会降低您的应用程序速度(但仍然可以提供良好的GL计时),或者在飞行中有多个查询。