【问题标题】:Is glmultmatrixf hardware accelerated?glmultmatrixf 硬件加速了吗?
【发布时间】:2015-01-17 14:29:24
【问题描述】:

我一直在为我正在做的合同运行一些测试,以改进一个非常旧的 opengl 应用程序,我惊讶地发现,在我尝试调用 glloadmatrix 和调用 glmultmatrixf 的 12 台计算机中有 10 台几乎相同的速度。

测试1:
- 初始化:什么都没有
- 对于场景:调用 glloadmatrixf
- 对于每个模型:glpushmatrix、gltranslate/glrotate/glscale、gldrawelements、glpopmatrix

测试2:
- init:预先计算每个模型的私有 mult 矩阵
- 对于场景:调用 glloadmatrixf
- 对于每个模型:glpushmatrix、glmultmatrixf、gldrawelements、glpopmatrix

测试3:
- init:预先计算每个模型的完整矩阵
- 对于场景:没有
- 对于每个模型:调用 glloadmatrixf,然后调用 gldrawelements

我很清楚 gltranslate/glrotate/glscale 从来都不是硬件加速的,它在opengl faq 中写得很清楚,但我虽然 glmultmatrixf 也不是。然而,在大多数计算机上,上面描述的具有数百个模型的测试用例 2 和 3 都提供了几乎完全相同的性能(差异可能是由于添加了 push/pop 矩阵),而测试用例 1 的速度明显慢于预期。

所以问题:我似乎无法在互联网上找到任何说明 glmultmatrix 是否通常是硬件加速的来源。有人知道吗?

ps:将这个旧应用程序升级到更新的 opengl 标准超出了本合同的范围

【问题讨论】:

  • 不值得加速,因为仅将 32 个浮点数上传到 GPU 会花费太长时间

标签: opengl


【解决方案1】:

您看到的是 test2 和 test3 中的绘制元素调用将成为 test1 矩阵操作的瓶颈。

做一个简单的矩阵乘法实际上很便宜(几十个乘法和加法),test1 的最大成本将是glRotate,它需要得到你想要旋转的角度的余弦和正弦。

【讨论】:

  • 这似乎是最可能的解释,然后 glmultmatrixf 不会被加速。但是我刚刚做了另一个类似的测试,用 10000 个简单的三角形来绘制,对应的 10000 mult/load 矩阵和 glmultmatrix 仍然几乎和 glloadmatrix 一样快。像你说的猜想,这可能意味着即使在那个量下,draw call 仍然是瓶颈,但我本来预计 10000*(几十个乘法和加法)不会那么便宜,因此非常引人注目。
【解决方案2】:

实际上,这取决于您要询问的硬件。

过去 15 年中所有主要的 OpenGL 实现都在 CPU 端使用 MMX/AltiVec/SSE/AVX 矩阵优化(许多驱动程序甚至在版本字符串中列出了这一点)。从我的角度来看,这是硬件加速——只是不是 GPU 方面的。

多个 OpenGL 矩阵命令实际上可以比从内存中加载预先计算的矩阵更快地完成,大约 10 年前我自己对此进行了广泛的测试。在我自己的测试中,它并没有快很多,而且对于现代 CPU 和现在通常的渲染瓶颈是填充率而不是顶点变换之类的东西,这可能是无关紧要的。

【讨论】:

  • 好吧,这听起来像是解释了一切。 glmultmatrix 的速度与 glloadmatrix 不相似的 2 台计算机都非常老旧,因此驱动程序可能没有包括对大约 12 年历史的 CPU 的优化,或者这些 CPU 的矩阵运算速度很慢。
  • 好吧,所以我刚刚完成了我发布问题后开始的内容,我跟踪了那些 opengl 函数等等。 glmultmatrix 是 100% 的软件,并按照您的描述进行了优化。 glloadmatrix 不是一个简单的设置,首先存储提交的矩阵,然后从中计算出一堆东西。乍一看,我会说 glloadmatrix 的工作量是 glmultmatrix 的 50-75%。
猜你喜欢
  • 2012-04-12
  • 1970-01-01
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 2011-06-05
  • 2018-11-02
  • 1970-01-01
相关资源
最近更新 更多