为什么?
为什么GPU不能简单地成为具有通用计算单元的大规模并行设备,而光栅化器只是其中的一个是为用户提供的用于该设备的软件吗?
具有固定功能的硬件是否具有如此有益的性能,以至于这种方法不可行?
#1 楼
简而言之,性能原因就是为什么它们不能被编程。历史和市场
过去,顶点和片段处理器曾经有单独的内核以避免膨胀。 FPU设计。例如,您只能在片段着色器代码中执行一些数学运算(因为它们仅与片段着色器最相关)。对于无法充分发挥每种类型内核潜力的应用,这将产生严重的硬件瓶颈。
随着可编程着色器的普及,通用单元被引入。在硬件中实现了越来越多的图形流水线阶段,以帮助扩展。在此期间,GPGPU也变得越来越流行,因此供应商不得不整合其中的一些功能。仍然需要注意的是,尽管GPU的大部分收入仍是视频游戏,所以这不会影响性能。
最终,英特尔的大公司决定投资具有他们的Larrabee架构。该项目本来应该是开创性的,但是性能显然不如预期。它已关闭,并且部分产品已被至强融核处理器使用。值得注意的是,其他供应商尚未实现此功能。
软件光栅化器的尝试
已经尝试了一些通过软件进行光栅化的尝试,但他们似乎都尝试过性能方面的问题。
Nvidia在2011年进行了一次尝试。该版本是在Larrabee终止时发布的,因此很有可能是对此的回应。无论如何,其中都有一些性能指标,并且大多数都表明性能要比硬件光栅化器慢许多倍。
软件光栅化的技术问题
Nvidia论文面临许多问题。但是,这是软件光栅化程序的一些最重要的问题:
主要问题
插值:
硬件实现在专用硬件中生成插值方程。这对于软件渲染器来说很慢,因为它必须在片段着色器中完成。
抗锯齿:
抗锯齿(特别是内存)也存在性能问题。有关子像素样本的信息必须存储在片上存储器中,不足以容纳这些信息。 Julien Guertault指出,使用软件可能会使纹理缓存/缓存变慢。 MSAA当然存在问题,因为它会溢出缓存(非纹理缓存)并从芯片外进入内存。光栅化器压缩存储在该内存中的数据,这也有助于提高性能。
功耗:
Simon F指出功耗会更低。该论文确实提到了自定义ALU位于光栅化器中(这将减少功耗),这是有道理的,因为过去片段和顶点处理单元曾经具有自定义指令集(也可能有自定义ALU)。当然,这将是许多系统(例如移动系统)的瓶颈,尽管这不仅影响性能。
总结
TL; DR:软件效率低下太多渲染无法过去,这些东西加起来。还有很多更大的限制,尤其是在处理VRAM带宽,同步问题和额外的计算时。
评论
$ \ begingroup $
如果框过滤足够了,那么我不认为需要存储亚像素样本,那么您就可以进行移动平均。
$ \ endgroup $
– joojaa
16-10-2在19:41
$ \ begingroup $
我怀疑纹理采样和缓存也可能是硬件实现所允许的性能的领域,而这些性能是软件实现无法实现的。
$ \ endgroup $
–朱利安·盖尔特(Julien Guertault)
16-10-3在2:37
$ \ begingroup $
@aces另一个值得一提的是力量。专用硬件通常仅用一小部分电源预算即可完成相同的工作,而且由于电源节流已经成为问题,尤其是在移动设备上,完全可编程将使情况更加恶化。
$ \ endgroup $
–西蒙F
16-10-3在12:02
$ \ begingroup $
@JulienGuertault公平的观点,但是我认为这主要适用于MSAA。测试结果似乎表明,当一切都适合片上存储器时,这并不是一个大问题(尽管这可能会对性能产生一些影响)。
$ \ endgroup $
–aces
16-10-4在3:47
$ \ begingroup $
@SimonF我认为这也很重要。我把它包括在答案中。
$ \ endgroup $
–aces
16-10-4在3:49
评论
“为什么图形处理单元不在通用处理单元中”,您对此有疑问吗?@Andreas不,我的问题就是帖子中所说的。当光栅化器可以用软件完成时(实际上它们已经可以用OpenCL或计算着色器完成)了,为什么光栅化器仍然是硬件的一部分。问题是为什么它不常见...也许只是性能,我不知道,这就是为什么我要问...
您可以绕过光栅化,并在现代GPU上使用计算单元实现自己的光栅化器,而我实际上知道有人出于特定目的进行此操作。
光栅化器将矢量多边形转换为一束我们可以点亮的像素。当我们不再有像素或不再使用矢量几何时,我们将不再需要光栅化器。无论管道的其余部分是什么样子,在一天结束(或一帧)时,都需要像素。光栅化器只是告诉我们给定三角形涉及哪些像素。所有这些都是可编程的-如果您希望光栅化器提供不同的输出,请发送不同的三角形。或者只是将所有内容绘制到计算着色器中的渲染纹理上,然后使用与视图对齐的四边形将其着色到屏幕上。