基于GPU的模拟运行时无法解释?

时间:2014-12-12 19:55:40

标签: performance opengl visual-c++ gpu nsight

我正在使用OpenGL和GLSL-Shaders开发基于GPU的模拟,我发现当我添加额外的(不必要的)GL命令时性能会提高。

模拟完全在GPU上运行而没有任何传输,并且基本上由执行2500个算法相同时间步骤的循环组成。我仔细地实现了GLSL统一位置的缓存,并删除了任何GL状态请求(glGet *等)以最大化速度。为了测量挂钟时间,我在主循环之后放了一个glFinish,然后花了经过的时间。

案例A: 所有迭代的正常总运行时间 490ms

案例B: 现在,如果我在每个时间步结束时添加一个额外的glGetUniformLocation(...)命令,它总共只需要 475ms ,速度提高3%。 (请注意,这与我相关,因为以后我会执行更多的时间步骤)

我查看了使用Nvidia nsight捕获的时间线,发现在情况A中,所有opengl命令都在前140ms内发出,glFinish需要348ms才能完成所有GPU工作。在情况B中,opengl命令的发布分布在相当长的时间(410ms),而glFinish只需要64ms,总共产生475ms。

我还注意到,在案例B中,硬件命令队列大部分时间都充满了工作包,而在案例A中,大多数时间只有一个项目等待(但是,没有可见的空闲时间)

所以我的问题是:

  • 为什么B更快?
  • 为什么在A?
  • 的情况下,命令包会更均匀地发布到硬件队列中
  • 如何在不添加其他命令的情况下提高速度?

我在Win7 x64上使用Visual c ++,VS2008。

1 个答案:

答案 0 :(得分:0)

恕我直言这个问题肯定无法回答。对于我通过实验确定的价值,glFinish(和...... SwapBuffers)具有奇怪的运行时时间行为。我目前正在开发自己的VR渲染库,在此之前,我花了一些时间来分析OpenGL命令的时间线及其与图形系统的交互。而我发现的是,唯一一致的是,glFinish + ... SwapBuffers的计时行为非常不一致。

可能发生的是,这个glGetUniformLocation调用将OpenGL驱动程序拉入" busy"州。如果你之后立即调用glFinish,它可能会使用不同的方法等待GPU(例如它可能在等待标记的while循环中旋转),而不是只调用glFinish(它可能等待信号或条件)变量因此受内核调度行为的影响。)