尽管有进步,现代GPU仍具有固定的光栅化器。高度可定制的,带有可编程的着色器,但是仍然不是完全可编程的。
这是为什么?
为什么GPU不能简单地是具有通用计算单元的大规模并行设备,而光栅化器只是用户提供的用于该设备的软件?
具有固定功能的硬件是否在性能上如此有益,以致于这种方法不可行?
尽管有进步,现代GPU仍具有固定的光栅化器。高度可定制的,带有可编程的着色器,但是仍然不是完全可编程的。
这是为什么?
为什么GPU不能简单地是具有通用计算单元的大规模并行设备,而光栅化器只是用户提供的用于该设备的软件?
具有固定功能的硬件是否在性能上如此有益,以致于这种方法不可行?
Answers:
简而言之,性能原因就是为什么它们不可编程。
过去,顶点和片段处理器曾经有单独的内核,以避免过大的FPU设计。例如,您只能在片段着色器代码中执行一些数学运算(因为它们仅与片段着色器最相关)。对于不会最大程度发挥每种核心潜力的应用,这将产生严重的硬件瓶颈。
随着可编程着色器的流行,通用单元被引入。在硬件中实现了越来越多的图形流水线阶段,以帮助扩展。在此期间,GPGPU也变得越来越流行,因此供应商不得不采用其中的某些功能。值得注意的是,尽管GPU的大部分收入仍是视频游戏,所以这不会影响性能。
最终,英特尔决定采用Larrabee架构投资可编程光栅器。该项目本来应该是开创性的,但是性能显然不如预期。它已关闭,并且部分产品已被Xeon Phi处理器处理。值得一提的是,其他供应商尚未实现此功能。
已经尝试通过软件进行栅格化,但是它们似乎都与性能有关。
一个显着的努力是一个由Nvidia公司试图在2011年这个文件。该版本是在Larrabee终止时发布的,因此很有可能是对此的回应。无论如何,其中都有一些性能指标,并且大多数都表明性能要比硬件光栅化器慢许多倍。
Nvidia论文面临许多问题。但是,以下是软件光栅化程序的一些最重要的问题:
插值: 硬件实现在专用硬件中生成插值方程。这对于软件渲染器来说很慢,因为它必须在片段着色器中完成。
抗锯齿: 抗锯齿(特别是内存)也存在性能问题。有关子像素样本的信息必须存储在片上存储器中,不足以容纳这些信息。Julien Guertault指出,使用软件可能会使纹理缓存/缓存变慢。MSAA当然存在问题,因为它会使高速缓存(非纹理高速缓存)溢出并从芯片外进入内存。光栅化器压缩存储在该内存中的数据,这也有助于提高性能。
功耗: Simon F指出功耗会更低。该论文确实提到了自定义ALU位于光栅器中(这将减少功耗),这是有道理的,因为过去片段和顶点处理单元曾经具有自定义指令集(也可能有自定义ALU)。当然,这将成为许多系统(例如移动系统)的瓶颈,尽管这不仅影响性能。
TL; DR:存在太多效率低下的问题,软件渲染无法克服,这些事情加起来。还有许多更大的限制,尤其是在处理VRAM带宽,同步问题和额外的计算时。