当前位置:  开发笔记 > 后端 > 正文

哪些OpenGL功能不是GPU加速的?

如何解决《哪些OpenGL功能不是GPU加速的?》经验,为你挑选了3个好方法。

当我读到这篇文章(来自OpenGL wiki)时,我很震惊:

glTranslate,glRotate,glScale

这些硬件加速了吗?

不,没有已知的GPU可以执行此操作.驱动程序计算CPU上的矩阵并将其上载到GPU.

所有其他矩阵操作也在CPU上完成:glPushMatrix,glPopMatrix,glLoadIdentity,glFrustum,glOrtho.

这就是GL 3.0中不推荐使用这些函数的原因.您应该拥有自己的数学库,构建自己的矩阵,将矩阵上传到着色器.

长一段时间里,我认为大多数OpenGL函数都使用GPU来进行计算.我不确定这是否是一种常见的误解,但经过一段时间的思考,这是有道理的.由于状态切换太多,旧的OpenGL函数(2.x及更早版本)实际上不适合实际应用程序.

这让我意识到,许多OpenGL函数可能根本不使用GPU.

所以,问题是:

哪个OpenGL函数调用不使用GPU?

我相信知道上述问题的答案将有助于我成为一名更好的OpenGL程序员.请分享一些您的见解.

编辑:

我知道这个问题很容易导致优化水平.这很好,但这不是这个问题的意图.

如果有人知道某个流行实现的一组GL函数(如AshleysBrain建议,nVidia/ATI,可能依赖于操作系统)不使用GPU,那就是我所追求的!

合理的优化指南稍后会出现.让我们关注本主题的功能.

EDIT2:

本主题不涉及矩阵转换的工作原理.还有其他 主题.



1> Bahbar..:

男孩,这是一个很大的主题.

首先,我将从显而易见的开始:既然你从CPU调用函数(任何函数),它必须至少部分地在CPU上运行.所以真正的问题是,在CPU上完成了多少工作以及在GPU上完成了多少工作.

其次,为了让GPU执行某些命令,CPU必须准备一个命令描述来传递.这里的最小集合是一个描述要做什么的命令令牌,以及要执行的操作的数据.CPU如何触发GPU执行命令也很重要.由于大多数情况下,这是昂贵的,CPU不经常这样做,而是在命令缓冲区中批处理命令,并简单地发送整个缓冲区供GPU处理.

所有这些都表明将工作传递给GPU并不是一项自由练习.这个成本必须与仅在CPU上运行该功能相对应(无论我们在谈论什么).

退后一步,你必须问自己为什么你需要一个GPU.事实是,纯粹的CPU实现完成了这项工作(正如AshleysBrain所提到的).GPU的强大功能来自于它的设计:

专门的任务(光栅化,混合,纹理过滤,blitting,......)

当CPU更多地设计用于处理单线程工作时,大量并行工作负载(DeadMG指向他的答案).

这些是为了决定芯片中的内容而遵循的指导原则.任何可以从中受益的东西都应该在GPU上运行.其他任何东西都应该在CPU上.

顺便说一下,这很有趣.GL的一些功能(主要是在弃用之前)实际上没有明确描述.显示列表可能是此类功能的最佳示例.每个驱动程序都可以自由地从显示列表流推送到GPU(通常以某种命令缓冲区形式)以便以后执行,只要保留GL显示列表的语义(这有点难以实现)一般).因此,一些实现仅选择将显示列表中的有限子集调用推送到计算格式,并选择简单地重放CPU上的其余命令流.

选择是另一个不清楚在GPU上执行是否有价值的选择.

最后,我不得不说,一般来说,API调用与CPU或GPU上的工作量之间几乎没有相关性.状态设置API倾向于仅修改驱动程序数据中某处的结构.它的效果只有在调用Draw或其他类似的东西时才可见.

很多GL API都是这样的.那时,询问glEnable(GL_BLEND)是在CPU还是GPU上执行是没有意义的.重要的是调用Draw时是否会在GPU上进行混合.因此,从这个意义上讲,大多数 GL入口点都没有加速.

我还可以扩展数据传输,但Danvil谈到了它.

我将完成小"s/w路径".从历史上看,无论硬件特殊情况如何,GL都必须遵守规范.这意味着如果h/w没有处理特定的GL功能,那么它必须模拟它,或者在软件中完全实现它.有很多这样的情况,但很多人都遇到过GLSL开始出现的情况.

由于没有实际的方法来估计GLSL着色器的代码大小,因此决定GL应该将任何着色器长度视为有效.其含义相当明确:要么实现可以采用任意长度着色器的h/w-当时不现实,要么实现为/ w着色器仿真(或者,如某些供应商选择的那样,根本不符合要求).因此,如果你在片段着色器上触发了这个条件,那么即使你有一个GPU选址空闲,你的整个 GL最终都会在CPU上执行,至少对于那个抽奖来说是这样.


我必须说,*是*很长的帖子.它有很多历史,非常好.我非常喜欢阅读它.到目前为止,我已经得出结论,没有明确的清单,但更多的是一般指导方针和理解是吗?感谢大家.我将接受这个答案并思考下一个不可能的事情.

2> Danvil..:

问题应该是"哪些功能会占用大量的CPU时间?"

保持投影和视图的矩阵堆栈并不是GPU可以比CPU更好地处理(相反......).另一个例子是着色器编译.为什么要在GPU上运行?有一个解析器,一个编译器......,它们只是普通的CPU程序,比如C++编译器.

例如glReadPixels,可能是"危险"的函数调用,因为数据可以通过有限的总线从主机(= CPU)内存复制到设备(= GPU)内存.在这个类别中也有像glTexImage_D或的功能glBufferData.

所以一般来说,如果你想知道OpenGL调用吃多少CPU时间,试着去理解它的功能.并注意所有功能,将数据从主机复制到设备并返回!



3> Puppy..:

通常,如果操作是按某种方式进行的,则会在GPU上进行.一个例子是实际转换 - 每个顶点执行一次.另一方面,如果每次大型操作仅发生一次,它将在CPU上 - 例如创建变换矩阵,每次对象的状态改变时只执行一次,或每帧一次.

这只是一个普遍的答案,一些功能将以相反的方式发生 - 以及依赖于实现.但是,通常情况下,程序员对您来说无关紧要.只要你允许GPU有足够的时间来完成它的工作,而你没有做游戏模拟或其他什么,或者有一个坚实的线程模型,你不应该担心它那么多.

@向GPU发送数据:据我所知(仅使用Direct3D),它都是在着色器中完成的,这就是着色器的用途.

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有