我正在使用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中,大多数时间只有一个项目等待(但是,没有可见的空闲时间)
所以我的问题是:
我在Win7 x64上使用Visual c ++,VS2008。
答案 0 :(得分:0)
可能发生的是,这个glGetUniformLocation调用将OpenGL驱动程序拉入" busy"州。如果你之后立即调用glFinish,它可能会使用不同的方法等待GPU(例如它可能在等待标记的while循环中旋转),而不是只调用glFinish(它可能等待信号或条件)变量因此受内核调度行为的影响。)