本帖最后由 sapphirex 于 2011-6-28 21:11 编辑
传统GPU管线的的概念和SIMD架构
以上诸多单元协同工作,就形成了渲染管线(Shader Pipeline)的概念。渲染管线也习惯上被成为渲染流水线,从某种程度上来讲,我们可以把它看做工厂里面常见的生产流水线,工厂里的生产流水线是为了提高产品的生产能力和效率,而渲染管线则是提高显卡的工作能力和效率。当然,同样按照工种,还可分为顶点渲染管线(Vertex Shader Pipeline,主要就是指顶点单元)和像素渲染管线(Pixel Shder Pipeline,包括PSU、TMU和ROP/RBE),而我们常说的渲染管线就是指像素渲染管线。
在传统GPU实时渲染的时候,一条管线显然是远远不够的,于是多条管线并行处理的结构诞生了。一般在同等芯片的对比情况下,管线数量越多性能越高;同样管线数量的情况下,新核心的性能要高于于老核心的产品。不过另外一个问题又出现了,传统意义上的像素流水线各个部分单元比例相当,但随着3D图形技术的发展,管线各部分负载的压力开始不均衡起来。
最简单的例子就是,VS很快完成顶点处理的任务,然后发现PS部分还忙得不可开交。由于运算量太大,PS既不能接收VS的新数据,又不能给后面的ROP/RBE输出信号,就造成数据的延迟出现。所以PS成为了管线中的瓶颈;这种情况下,使用更多的PS单元来加强像素和纹理处理工作就成为显卡着重改进的地方。而PS的数量也成了衡量显卡性能的标准之一(针对早期GPU来说)。
VS和PS都是四元组结构
经过上面的介绍,我们知道VS和PS是传统GPU中的两项重要指标,那么VS和PS在架构又有何异同呢?在计算机图形处理中,最常见的像素数据都是由R、G、B(红、绿、蓝)三种颜色构成的,加上它们共有的信息说明(Alpha),用来表示颜色的透明度,加起来总共是四个通道;而顶点数据一般是由X、Y、Z、W四个坐标构成,这样也是四个通道。所以从架构上来看,VS和PS既有相同又有不同之处。相同之处在于,二者处理的都是四元组数据,不同之处在于VS需要比较高的计算精度,而PS计算精度较低。
事实上,在3D图形进行渲染的过程中,VS和PS的主要工作就是进行X、Y、Z、W四个坐标运算和计算除R、G、B、A得出像素颜色。为了一次性处理1个完整的几何转换或像素渲染,GPU的VS和PS从最初就被设计成为同时具备4次运算能力的算数逻辑运算器(ALU)。 而数据的基本单元是Scalar(标量),就是指一个单独的变量,所以GPU的ALU进行一次这种变量操作,被称做1D标量。
SIMD架构示意
与标量对应的是Vector(矢量),一个矢量由N个标量标量组成。所以传统GPU的ALU在一个时钟周期可以同时执行4次标量的并行运算被称做4D Vector(矢量)操作。虽然GPU的ALU指令发射端只有一个,但却可以同时运算4个通道的数据,这就是单指令多数据流(Single Instruction Multiple Data,SIMD)架构。
SIMD的弊端和统一渲染架构的出现
承接上文,由于先天性设计的优势,SIMD能够有效提高GPU的矢量处理性能,尤其是在顶点和像素都是4D矢量的时候,只需要一个指令端口就能在单周期内完成预运算,可以做到100%效率运行不浪费运算单元。虽然早期SIMD执行效率很高,因为很多情况都是4D矢量的运算操作。但随着3D技术的不断发展,图形API和Shader指令中的标量运算也开始不断增多,1D/2D/3D混合指令频率出现,这时SIMD架构的弊端就显现出来了。当执行1D标量指令运算的时候,SIMD的效率就会下降到原来的1/4,也就是说在一个运算周期内3/4的运算单元都被浪费了。
混合型SIMD架构的出现
遇到问题的时候,当时的ATI和NVIDIA都在寻求改进。进入DX9时代之后,混合型SIMD设计得到采用,不再使用单纯的4D矢量架构,允许矢量和标量指令可以并行运算(也就是Co-issue技术)。比如当时的ATI的R300就采用了3D矢量+1D标量架构,而NVDIA的NV40之后也采用了2D矢量+2D标量和3D矢量+1D标量两种运算模式。虽然Co-isuue技术一定程度上解决了SIMD架构标量指令执行率低的问题,但遇到需要分支预测运算的情况,依然无法发挥ALU的最大运算能力。
除了SIMD架构的弊端之外,VS和PS构成的所谓“分离式”渲染架构也遭遇了麻烦。在全新一代图形API DirectX 10的到来之前,顶点渲染和像素渲染各自独立进行,而且一旦当架构确定下来,VS和PS的比例就会固定。微软认为这种分离渲染架构不够灵活,不同的GPU,其VS和PS的比例不一样,大大限制了开发人员自由发挥的空间。另外,不同的应用程序和游戏对像素渲染和顶点渲染的需求不一样,导致GPU的运算资源得不到充分利用。
分离式渲染架构:VS和PS负载不均
统一渲染架构:VS和PS负载均衡
举例来说,许多大型3D游戏中的独立渲染场景中,遇到高负载几何工作的时候,VS处理压力增大大,而PS单元工作较少很多时候都被闲置;反之,遇到高负载像素工作的时候,PS处理压力增大,而VS又处于闲置状态。加上传统的PS和VS以前都是各自为战,彼此不相干涉,PS也帮不上VS任何忙,也就造成了GPU执行效率的降低。传统的管线架构已经跟不上时代了,而这也就促使了DirectX 10中统一渲染架构(Unified Shader Architecture)的出现。
分离式架构和统一架构的差异
所谓统一渲染架构,就是将传统的VS、PS以及DirectX 10新引入的GS进行统一分装。与传统GPU架构不同,此时的GPU不再分配单独的渲染管线,所有的运算单元都可以处理任何一种Shader运算(不论顶点操作、像素操作还是几何操作),而这种运算单元就是经常提到的统一渲染单元(Unified Shader,US)。它的出现避免了传统GPU架构中PS和VS资源分配不合理的现象,也使得GPU的利用率更高。US的概念一直沿用至今,一般来说US的数量越多,GPU的3D渲染执行能力就越强,所以US的数量也就成了判断显卡性能的一个主要标准。
Xenos与第一款统一渲染架构GPU
不过对于很多GPU爱好者来说,第一次接触统一渲染架构的概念并非来自桌面显卡,而是当时还没被收购的ATI于2005年与微软合作发布的XBOX 360游戏主机采用的Xenos图形处理器。Xenos采用了统一渲染架构,顶点、像素等操作都在US上执行,架构上区别于ATI以往任何一款GPU,是ATI第一代统一渲染架构,对日后的R600等也有较大影响。关于的详细架构,这里限于篇幅就不再过多介绍,感兴趣的读者可以自行查阅。
Xenos的逻辑架构示意图
那么第一款统一渲染架构的桌面GPU呢?虽然理论上这款GPU非ATI莫属,毕竟已经有了Xenos的设计经验。不过由于2006年7月份被AMD收购,ATI主要忙收购之后的事宜,研发精力大打折扣,反倒被没有统一渲染架构设计经验的NVIDIA在同年7月份抢先发布G80核心的GeForce 8800 GTX显卡,掀开了桌面统一渲染GPU架构的序幕。G80是NVDIA显卡历史上一款极具划时代意义的GPU,革命性的架构影响了日后的数代显卡。(虽然G80与AMD毫不相干,但通过G80的和下文R600的对比,我们能够发现A/N两家在面对统一架构时做出的不同选择。)
G80的流处理器结构
G80架构上的改变可谓相当激进,在实现统一渲染单元(Unified Shader,US)的过程中,将传统GPU架构中VS和PS中的4D矢量 ALU重新设计为功能更全的1D标量ALU,每一个ALU都有自己的专属指令发射器,所有运算全部转化为1D标量运算,可在一个周期内完成乘加操作。这种1D标量的ALU被NVIDIA称为流处理器(Stream Processors,SP)。
G80核心架构图
G80采用的1D标量式的流处理器架构称为多指令多数据流架构(MIMD),完全区别于传统GPU的SIMD架构。MIMD走的是彻底的标量化路线,这种实现的最大好处是灵活、效率更高,不论是1D、2D、3D、4D指令,G80都通过编译器将其拆成1D指令交给不同的SP来处理。
每个TPC的详细结构
这样也带来了一些问题,传统GPU中一个周期完成的4D矢量操作,在这种标量SP中需4个周期才能完成,或者说1个4D操作需要4个SP并行处理完成,那么执行效率是否会受到很大影响呢?不过NVIDIA异步架构将核心频率和流处理器频率分离,流处理频率进行了大幅提升,达到两倍于核心频率的水平,同时大幅增加流处理器数量的方法很好的解决了这一问题。
除了流处理器,G80的纹理单元也被重新设计,将传统纹理单元(TMU)的功能拆分为两种单元:纹理寻址单元(Texture Address Unit)和纹理过滤单元(TexTure Filtering Unit),它们以跟核心频率相同的频率运作,以1:2的比例组成了新的纹理渲染阵列(Tex Array)。
所以规格方面,G80核心拥有128个流处理器、64个纹理单元和24个光栅单元,由8个TPC(Thread Processing Cluster,线程处理器集群)组成,每个TPC中拥有两组SM(Streaming Multiprocesser,流式多处理器),每组SM拥有16个流处理器和8个纹理单元。每一个TPC都拥有独立的8个纹理过滤单元(Texture Filtering Unit,TFU)、4个纹理寻址单元(Texture Address Unit,TAU)以及L1缓存。
虽然MIMD架构看起来无懈可击额,不过和任何事物一样,GPU架构也不可做到完美。虽然1D标量ALU的设计执行效率很高,但也有相应的代价。理论上4个1D标量ALU和1个4D矢量ALU的运算能力是相当的,但是前者需要4个指令发射端和4个控制单元,而后者只需要1个,如此以来MIMD架构设计的复杂度和所占用的晶体管数都要远高于SIMD架构。 |