GPU架构演化史4: 2000-2006 AN争霸可编程

当GeForce 256将T&L整合进入并建立了GPU这个term后,ATI在2000年发布了T&L性能更好的Radeon系列产品线,其它厂家逐渐因为性能和技术的掉队退出了这个市场,曾经的王者3Dfx也在这个时候被nVidia收购,然后接下来的7年,AN之争又给GPU体系结构带来了一些新的变化。

首先是T&L硬件offload了以后,两家基本上都完全支持了OpenGL的固定流水线:

GPU架构演化史4: 2000-2006 AN争霸可编程

但是整个GPU工业界还处在一个固定流水线的时代,各种问题接踵而至,而最重要的就是性能的提升对更加丰富的API需求,从而带来了对设备可编程的需求。而对于渲染的DSL(Domain Specific Language),即Shader Language早在80年代就诞生了,例如Cook的Shade Tree及RenderMan Shading Language, 但遗憾的是GeForce 256并没有可编程的能力,只有若干的可配置的能力。

GPU架构演化史4: 2000-2006 AN争霸可编程

因此接下来的7年中,两家逐渐完成了可编程Vertex Shader和可编程Pixel Shader的开发,同时整个工业界也逐渐完成了API标准,诞生了,有基于OpenGL标准的GLSL 和基于DirectX标准的(HLSL),当然还有nVidia自家的C for graph(Cg).而相应的硬件也和软件标准整合在一起,从DirectX 8.0(Shader Model 1.0)到DirectX 10.0(Shader Model 4.0), 也从OpenGL 1.2 到OpenGL 3.0.

2001 Shader Model 1.0

部分可编程Vertex Shader

nVidia发布了第一个支持Vertex Shader可编程的GPU GeForce 3,而在发布时也同期发布了一篇SIGGRAPH的论文< A User-Programmable Vertex Engine >. 论文中很明确的讲到了需要Vertex Shader可编程的原因:由于GPU性能的快速增加,对于新的图形API的需求越来越多,各种计算的组合使得GeForce 256那一代的可配置能力要求爆炸性的增加,到最终变成了API对可编程硬件的需求。

论文也回顾了历史上其它公司的工作,结论是传统的做法都需要专家去非常细致的构建汇编代码来保证处理器能够接近理论峰值,并且需要非常关注Pipeline延迟、Stall的情况等. 而且整个Pipeline非常厂,例如下图的性能上的瓶颈需要考虑多点的限制,是否能加一些更加灵活的执行方式在性能和画质之间取得平衡呢?但是初代的Vertex engine并没有考虑到,只是简单的提供了一些汇编代码。

GeForce3的Vertex Engine在考虑到易用性方面,只是在整个几何计算流水线中暴露了一小部分的可编程能力,提供了一系列SIMD的浮点计算指令,不支持分支,提供固定的处理延迟,如下所示:

而对于所支持的DirectX 8.0标准中的Pixel Shader,在GeForce 3中尚未完全支持可编程的能力,只是添加了一个Texture Shader和Register Combiner:

Texture porgram则只是支持一些固定的操作,某种意义上来看只是更加容易配置,而不能将其称作可编程。当然这一切叠加起来使得GeForce3支持了硬件的Shadow Mapping、8x各向异性过滤、MSAA.. 但是遗憾的是GeForce 3推出时,支持Shader Model 1.0的游戏尚未推出,使得初期GF3的表现并不太出众。而在2001年10月ATI推出了Radeon 8500并首次支持了DX8.1。

2002 Shader Model 2.0

完整可编程VertexShader和部分可编程的Pixel Shader

2002年DirectX9.0的发布, 定义了新的Shader Model 2.0,同时标准的Shader Language也发布,HLSL被整合进DirectX9中,OpenGL ARB也发布了GLSL,这些语言涉及多深受C语言和RenderMan着色语言的影响。而在这个时候nVidia稍稍犯了一个小错误错误估计了DirectX8.0的生命周期,在GeForce 4发布的时候还是支持DirectX8, 而ATI破釜沉舟放弃了原来的架构,用时一年发布了Radeon 9700 Pro,性能完胜GeForce4,并且完全支持DX9和SM2.0.

SM2.0 中Vertex Shader引入了高级的流控指令,例如JumpLoopsubroutines,同时每个Shader支持的最大指令数增加到了1024条,这也为发布HLSL提供了基础。Radeon 9700和nVidia不同的思路是,它们的Vertex Shader采用了一个128-bit的向量处理器配合一个32bits的标量处理器,而并没有像nV那样提供SFU. 不过同样它也在处理器后整合了图元组装(Primitive Assembly), Culling/ Clipping/ Viewport Transform等固化的流水线。tessellation曲面细化也被加入,使得现有的程序渲染可以更加逼真。

Radeon 9700具有8条128bit渲染管线,每一条都具有独立的贴图单元和Pixel Shader处理单元,而在Pixel Shader中则定义了每一个渲染流水线必须在一个Pass中实现最多16个纹理采样,所以9700可以在一个流程中处理16个贴图,这些贴图可以是双线过滤、三线过滤或者各向异性过滤应用。而Geforce 4 仅支持4个。

Radeon 9700中的Pixel Shader引擎是利用浮点(96bit)运算控制的,这相对于早期的整数运算大幅度的提高了处理的范围和精度。其Pixel Shader处理单元可以同时处理三个指令:一个材质查询、一个材质地址处理和一个色彩处理,

而nVidia支持DX9的GeForce FX直到2003年才出现,Vertex Shader新增Branching的能力,支持单个程序65536条指令,循环深度也支持256个, 所以顺便也支持了Dynamic flow Control来应对整个Pipeline的性能问题,同Radeon 9700一样GeForce FX也整合了8条128bit浮点像素渲染管线,但它支持了CineFX最大128bit浮点的精度。

而伴随着花仙子的Demo,nVidia再一次王者归来,把渲染效果提升到了一个新的高度

2004 Shader Model 3.0

完全可编程的Vertex Shader和Pixel Shader

伴随着GeForce 6的发布,Vertex Shader和Pixel Shader都支持了完整分支、循环、预测等功能实现,最终一个完全支持高级渲染语言(Cg, DirectX HLSL, OpenGL GLSL)的平台诞生了,而HDR等特效也引入了主流游戏平台.

GeForce 6的Vertex Shader和Pixel Shader架构如下,注意到Vertex Shader中也可以进行纹理读取,这是SM3.0的新规范。

在Pixel Shader中也增加了动态执行的能力,这样获得了一个非常有效的处理方式,例如阴影贴图的处理:

同时3Dfx的SLI技术,Voodoo2双卡并行也在这个时候回归主流市场,而后面若干年慢慢的演化为了NVLink…

而从用户体验来看,整个开发流程也变得非常简单,例如一个OpenGL的示例,通过在C++程序中嵌入VertexShader和PixelShader的GLSL,就可以直接渲染了,开发难度比传统的汇编构建要容易得多,接下来很多年的渲染API基本上都没有太大的变换

2006 Shader Model 4.0

但是技术总归是需要进步的,遗憾的是在2006年ATI逐渐掉队被AMD收购了,基于SM4.0的DirectX 10 新增了在Vertex Shader(VS)和Pixel Shader(PS)之间的图元(Primitive)处理的单元,即Geometry Shader(GS)。同期OpenGL也增加了类似的功能,为什么增加GS呢?关于Geometry Shader在GPU Gems 3中有一段讲解:

因为GS在整个处理过程中可以用来做一些VS和PS都无法有效执行的任务,最后既然这一堆都可编程了,那么架构上是否可以再做一些创新呢?

答案是显然的,于是初代的CUDA就披着Unified Streaming Processing Array(USPA)的皮登场了,也就是我们常说的Tesla架构的G8x和后面的GT200系列,

当然还是有一些市场策略的,nVidia意识到了从Vertex Shader + Pixel Shader 到GP-GPU的整个变换过程,但还是先在2005年推出了Geforce 7,直到2006年才将初代CUDA G8X架构的芯片推出到市场,我们留到下一个章节详细讲述吧。

GPU架构演化史4: 2000-2006 AN争霸可编程》来自互联网,仅为收藏学习,如侵权请联系删除。本文URL:http://www.bookhoes.com/688.html