【问题标题】:How to measure time performance of a compute shader?如何测量计算着色器的时间性能?
【发布时间】:2015-03-26 08:55:26
【问题描述】:

我需要测量计算着色器的时间。但这当然不是微不足道的。 从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 也存在,但我不确定它是如何工作的,也不知道它是否对我有用。这些东西对我来说是新的,我不确定我现在是否完全理解它。

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

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

【问题讨论】:

    标签: c++ performance opengl compute-shader


    【解决方案1】:

    定时器查询绝对是要走的路。

    一般原则是创建“查询对象”,然后插入到 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 时间),或者正在进行多个查询。

    【讨论】:

      猜你喜欢
      • 2022-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      • 2013-02-21
      • 2017-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多