我与朋友讨论了有关OpenGL渲染管道性能的两个问题,我们想请求帮助确定谁是对的。
我认为吞吐量与所涉及的像素量呈线性关系,因此渲染4k场景的时间应该是渲染1080p场景的4倍。然后我们发现了这个分辨率-fps比较视频[见 1 ],并且缩放似乎不是线性的。有人可以解释为什么会这样吗?
我认为渲染1080p场景并渲染4k场景中的每1/4像素应具有相同的性能,因为在两种情况下都会绘制相同数量的像素[参见2 ]。我的朋友认为情况并非如此,因为可以使用一条指令完成附加像素计算。是对的吗?如果是这样,有人可以解释一下这在实践中是如何运作的吗?
插图:
答案 0 :(得分:4)
我认为吞吐量与所涉及的像素量呈线性关系,因此渲染4k场景的时间应该是渲染1080p场景的4倍。然后我们发现了这个分辨率-fps比较视频[见1],并且缩放似乎不是线性的。有人可以解释为什么会这样吗?
请记住:渲染发生在管道中。渲染只能以该管道的最慢部分的速度发生。哪个部分完全取决于您所呈现的内容。
如果你在GPU上每帧推送2M三角形,并且GPU每秒只能渲染60M三角形,那么你将看到的最高帧速率是30FPS。您的性能在顶点处理管道上存在瓶颈;你渲染的分辨率与场景中三角形的数量无关。
同样,如果你每帧渲染5个三角形,那么你的分辨率是多少并不重要;你的GPU可以在 micro -seconds中咀嚼它,并且会坐在那里等待更多。你的表现会因发送的数量而受到瓶颈。
如果您对渲染管道中与分辨率实际相关的部分存在瓶颈,则分辨率仅与性能呈线性关系:光栅化,片段处理,混合等。如果这些不是您的瓶颈,则无法保证您的性能会因提高分辨率而受到影响。
应该注意的是,现代高性能GPU需要在片段管道出现瓶颈之前被迫渲染很多东西。
我认为渲染1080p场景并渲染4k场景中的每1/4像素应具有相同的性能,因为在两种情况下都会绘制相同数量的像素[见2]。我的朋友认为情况并非如此,因为可以使用一条指令完成附加像素计算。是对的吗?
这完全取决于你如何设法使系统“渲染4k场景中的每1/4像素”。光栅化器通常不会绕过像素。那么你打算如何让GPU脱颖而出呢?使用模板缓冲区?
就个人而言,我无法想象如何在不破坏SIMD的情况下实现这一目标,但我不会说这是不可能的。
如果是这样,有人可以解释一下这在实践中是如何运作的吗?
你在谈论Single-Instruction, Multiple Data (SIMD)的本质。
渲染三角形时,在光栅化器生成的每个片段上执行片段着色器。但是你正在每个上面执行相同的片段着色器程序。对片段进行操作的每个FS使用相同的源代码。它们具有相同的“单指令”。
它们之间的唯一区别就是它们开始的数据。每个片段包含由顶点处理提供的插值的每顶点值。所以他们有“多套”“数据”。
因此,如果他们都将在不同的初始值上执行相同的指令...为什么要单独执行它们呢?只需使用SIMD技术执行它们。每个操作码都在不同的数据集上执行。因此,您只有一个硬件“执行单元”,但该单元可以同时处理4个(或更多)片段。
此执行模型基本上是GPU工作的原因。