taizer 发表于 2012-6-4 02:19

硬件百科全书之3D王朝---3D图形加速卡全解析

本帖最后由 taizer 于 2012-6-4 16:07 编辑

此文首发与3DM,转载请注明出处即可。3DM曾经汉化过那么多I社神作,首发再次聊表敬意。文中难免错误百出,结构混乱,这也是我文章的特点,欢迎指正,反正我早就破罐子破摔了。当然如果你在某个“哔”论坛PC版块看到此文不要惊讶,很有可能是我去混分的·······想完全诠释3D图形加速芯片的各个方面,做到层次分明有理有据,再做到精简就很困难了,但我依旧会尽量控制文本的整体规模。GPU全称Graphic Processing Uni ,直译过来就是图形处理单元。最初出现于NVIDIA的Geforce 256 3D图形卡以后。这本来算是个概念,因为当时NVIDIA的Geforce 256演示demo展示了非常精细的毛发效果,NVIDIA的意思是以后就有了这种CG级的游戏画面。同时期的ATI也提出了VPU的概念,但GPU这个名称更加广泛而被沿用至今。通常来说,对于PC用户中的3D游戏用户,其3D图形加速卡的性能是机器性能的第一标尺。本文的目的是从架构方面来拆分和分析GPU的各个方面。在绘制一幅3D场景中,GPU负责多边形的构造、贴图、着色器指令、光照、阴影填充、以及最终的像素输出。CPU负责顶点位置,阴影边框绘制、AI运算以及其他运算指令,包括网络。GPU要处理的东西具体到游戏主要分为材质库和着色器,这个我们从指令的角度拆着说,主要从GPU架构来分析对性能影响的各个单元。本文不涉及显卡本身,这部分我会放在主板一文来写。(如果我写的话)非统一渲染架构已经没有必要讨论,于是从最典型的统一渲染架构来逐步描述。对于混乱的论证层级请勿怪。我们将3D图形的处理一般称为图形流水线,这个过程大致是这样的:3D建模--多边形坐标变换及计算--光源处理--多边形坐标转换为屏幕所对应的坐标---对这些坐标做着色器和贴图运算---渲染及缓冲---输出图像。当然这之前还有指令列表处理几何处理以及渲染流输出等。具体到流程,首先是Input Assembler Stage(输入汇编阶段),这个阶段依靠图元以及顶点信息作生成顶点、和图元地址。再由Geometry Shader一次性处理全部图元,其中可直接包含三角形、线、点。在G80中还引入了Geometry Shader,其主要作用是分担一部分物理操作。最后进行缓存输入、深度/Stencil测试和alpga混合。我到这里得打住,乱了。先从GPU的规格谈起,再说架构吧。对于GPU性能的判定,主要从规格和架构2个方面。第一节:规格和指标GPU主要规格指标:流处理器数量阵列数量光栅处理器数量显存控制器数量纹理单元数量核心频率显存频率显存容量先依次简单分析1.流处理器数量流处理器数量是3D图形核心重要性能指标。目前微软的directx作为最广泛的图形API,在一帧画面中所输入的指令几乎全部由流处理器来运算。从坐标到像素再到光源以及相应的转换,包括由于画面形成过程中所形成的数学向的计算。因此流处理器的数量越多,GPU的运算能力也就越强。特别是在光源复杂的环境,以及像素级纹理大量运用的场景,只要指令端口和外部总线可以承受住线程压力,这种运算能力的提升几乎是成绝对线性的,理论上说只要程序员敢调用足够多的着色器,就可以形成CG级的游戏画面。当然这只是理想的情况,实际的运用中限制就很多很多了。而且流处理器数量也和通用计算能力息息相关。在早期directx9系列显卡的ALU,具备全4D运算能力,但无论1D还是4D,ALU只能以等效于核心频率进行运算。因此在对比directx9显卡的渲染管线和directx10、11显卡的流处理数量的时候不可绝对的画等号来比较,这里略微提下。2.阵列数量我在这里无论是GPC,TPC还是SM,SMX,都看作是近似的阵列。严格意义上来说SM和SMX才是真正的阵列。GPC和TPC更接近于材质通道/线程通道这种单元。TPC在D11时代已经消失,不再讨论。GPC作为阵列的集合存在,从物理结构上来说包含SMX和细分曲面单元,从功能上来说又在线程分派上起着承上启下的作用。随着SMX的线程分派器的功能日益强大,GPC的数量相对于ALU的整体规模实际上是在缩小的。从好的一面说,在密集型线程方面,这种架构有着延迟低的优势,而劣势是阵列的线程分派器的压力就很大了。现在SMX能够容纳的ALU单元数量,从本质上来说,并不是阵列能容纳的数量而是SMX这一级的指令分派器能够容纳的数量。从目前单SP的执行效率来看,如果下一步GPU需要扩容ALU单元来提升性能,那么GPC的数量会进一步提升,阵列内含的ALU数量提升会止步或者提升较小。3.光栅处理器光栅处理器处于外部总线的末端,所有处理好的指令包括纹理纵深光源都由光栅处理器转化为像素并且最终输送到显示器。也就是说,光栅处理器几乎是GPU的必然短板。无论内部如何强大,最终光栅化的时候如果光栅处理器数量不够就会造成帧数下降从而影响用会的使用体验。在物理结构上光栅处理器和显存控制器挂钩,每64bit的显存控制器和一组光栅处理器一起。最初的每组显存控制器只携带一个ROP,目前这个数量已经提升到了8个。ROP的总数量最大是位宽/64×8,可以低于这个数量,但不可能比这个高。而且由于设计上的原因,光栅处理器的数量扩大非常困难。更主要的是,由于光栅处理器直接影响GPU的像素处理能力,所以其数量也极大的影响GPU的抗锯齿性能。特别是在复杂光照的环境下,材质表面的漫散射加上全局光照对像素的压力,加上由于多光源下的延迟渲染导致的抗锯齿压力非常巨大。4.显存控制器数量显存控制器每个为64bit,所以显存控制器的多寡也就是显卡位宽相关。由于显存带宽是显存频率×显存位宽/8,而显存带宽责和显卡的性能相关性非常的大,加之显存控制器数量和ROP数量直接挂钩,说显存控制器的多寡和GPU的整体性能成几乎绝对的线性正比。显存里存放着材质库,帧缓冲,顶点信息,着色器等GPU输入或者输出的重要数据,显存的速度也就直接决定了显卡能运行的帧数。而在GPU的设计中,显存控制器也成为永恒的短板,其原因很多。显存控制器的晶体管耗用极大,而当显存控制器数量较多的时候,外部总线压力也在随着增大,最终影响显存控制器能够吃下的显存频率,甚至进一步影响显卡的核心运行频率,而ALU和ROP等重要单元频率都和核心频率挂钩,所以显存控制器的数量多寡在设计的时候也是R&D要考虑的重要方面。另一方面,使用加大显存位宽的方式来提升显存频率固然美好,但随之带来的成本问题确非常巨大。由于单个颗粒的显存位宽是固定的(通常规为32bit),一个256bit的显卡只需要256/32=8颗就可以布置完毕,如果这个位宽是512bit则需要至少16颗颗粒,这还不是主要的。为256bit的8颗粒完成布线,6层PCB板就足够了,而512bit需要12层甚至更多。而PCB的成本占显卡制造成本的绝对大头,而PCB的物料成本是不高的,真正高的就是布线成本。所以现在的GPU制造商都采取使用每显存控制器携带更多ROP,同时使用高频率颗粒的方式在低显存控制器数量的情况下维持相对较高的像素输出能力和显存带宽。5.纹理单元数量纹理单元数量曾经一度是GPU性能第一标尺,但随着统一渲染架构的出现,纹理单元的作用实际应该在逐渐弱化。我曾经甚至认为在不久的将来纹理单元的数量将不会被GPU厂商作为一个重要规格来展示。在GPU形成像素输出之前,画面在形成的过程中有一步很重要的贴图步骤就是由纹理单元来完成的。在多边形表面形成材质才能最终反映出接近真实的3D画面。而且大量的游戏也采用预先烘培好的材质贴图来优化画面。所以纹理单元数量直接关系GPU高分辨纹理下的性能。比如孤岛危机弹头大量采用动态纹理(纹理会根据人物的观察视角的改变而变化坐标,并产生一定的覆盖效果,也就是动态法线)和高分辨纹理,带来真实纹理体验的同时也带来了巨大的性能损失。G80体系架构下的纹理短板造成它在这个游戏里的性能没有达到预期。由于人眼对颜色的辨识相对多边形来说要更为敏感,所以用材质贴图来实现物体的真实感也一直以来被大量使用,特别是在GPU运算能力相对低下的年代。比如一个抽屉的把手,就可以采用贴图来实现,这相对于直接使用顶点+着色器来渲染负载要低得多,而且效果也较为接近。但这也有问题,那就是目前的GPU其shader处理能力已经及其强大,但程序员依旧习惯于使用纹理来实现华丽的画质,这不得不说是一种退步。即使CE3都是基于D9开发环境的,然后辅助以烘培好的高分辨纹理来实现D11画质,甚至于3D mark11测试软件都更加偏向于使用纹理。一方面是方便引擎的快速过渡,另一方面可能和引擎要照顾到多平台有关,这个不仅仅是考虑到在使用D9显卡的用户,还有不具备粒子操作能力的家用机GPU。而在寒霜2引擎中,我们最明显的感觉就是出色的光照,寒霜2的光照就是基于D11的 compute shader制作,我们也能看到新一代的D11显卡在这个游戏里表现良好,像素纹理的应用也逐渐开始,我们翘首以盼吧。就像Z-bufferZ-Cull Stencil-Cull 现在就不怎么再提了,Z/Stencil 操作根据Z轴剔除不可见的像素,以减少最终的像素操作,现在剔除操作在像素输出时完成,如果在渲染之前剔除则存在一种仲裁压力和返回检查带来的延迟,据说在抗锯齿开启后ROP压力反倒更大。目前采用渲染前剔除操作的就是powerVR 公司的SGX系列GPU,平板里这个东西居多,早期的intel整合芯片譬如GMA3000其实就是SGX545。而现在Z/Stencil单元已经不作为性能标尺被明显标注数量了。6.核心频率核心频率自然是越高越好,这里谈谈相关性的问题。GK104之前nvidia通过一种倍频技术实现了流处理器的异步频率,这个技术最早出现在G71核心上,nvidia给予G71的shader单元一个以23Mhz的步进频率,这个提升幅度非常小,小到你感觉不到它带来的性能提升,只是你在超频的时候这个步进频率会影响到GPU的实际运行频率导致超频失败,那时候的shader异步更接近于现在的睿频技术。GK104回归流处理器和核心同频其实就是因为频率的相关性带来的设计思路改革,这也和我上面说纹理单元的时候提到的纹理依旧大行其道也有关系。核心频率和运算单元、线程单元以及非常重要ROP单元同频或者程步进频率关系。在RV770对战G200的堪称史诗级别的对决中,RV770以小核心打得规格强上很多的G200非常难受。G200的规格要高的多,问题出在哪里。RV770的小插曲:我们只能很遗憾的承认,当今的AMD图形团队已经不是当年那个设计RV770的带有狂热工程师导向的团队了。在RV770的设计上,曾经流传着各种坊间传说,其中一个版本就是RV770的首席设计师在设计之初坚定不移的要应用DDR5显存颗粒。当然这个故事有另外的版本,按照通常的核心策略,RV600之后经过修改推出RV670,那么之后的RV770在规格上应该有比较大的改动。在设计之初,RV770的目标被定位于次顶级版本也就是4850性能要略超过3870同时超过8800GT,而旗舰型号也就是4870(4890是新制程)性能要略高于9800GTX。连NVIDIA也是这么预测的,所以G200没有设计中端型号。按照NVIDIA的估计,260 275以及280将是一种类似8800GTS 8800GT 8800TX的定位(这是按照RV600来说明而不是G92和RV670的局面),也就是高端无对手,价格空间宽裕。然后设计了GT240,一个在性能上接近9600GT的中低GPU配合9800GTX来合围想象中的4850,然后使用9800GTX和260来合围4870。AMD这边则希望设计一个至少可以大幅度击败G80的单卡,因为此时8800Ultra已经停产很久了。最先设计出来了一个SP规模640,同时使用DDR4显存控制器的版本,效果很不理想,8800Ultra的阴霾甚至都无法一扫而光,于是设计团队激进的使用了DDR5规格的显存控制器,后面的故事我们都知道了,RV770成就了ATI的小核心传奇。4870和GTX260 192SP的比较就非常典型。260的ROP数量是28,4870是16个,但260当时的核心频率仅为576,而4870高达750,像素输出优势并不大。而且加上GDDR5颗粒的高频,260的位宽优势基本没有带来更高的带宽,只换来恐怖的PCB布线成本,260的运算单元数量优势也被主频拖累。GK104的思路就是放弃2倍SP频率,换来高核心频率,更高的频率显存控制器,同时小核心方便它布置更多的纹理单元,带来游戏性能的均衡提升。当然NVIDIA的之前分频SP以及明显短板的显存控制器设计还有其他的原因在里面,这个我放到芯片策略一节来讲。所以有的时候规格也未必是绝对主导,核心频率较高的小核心也能依靠频率带来的运算能力全面提升实现较高性能。7.显存频率和显存大小在这个里我决定讲二者合并说明.显存频率和显存位宽决定显存带宽,显存带宽则决定着显卡的吞吐性能,特别是高分辨率下的抗锯齿加上高分辨率纹理下的画面。显存中主要存放着材质库,帧缓冲,顶点信息,着色器,着色器很多但占空间不大。如果显存频率和显存位宽双低,则会造成显卡在输入和输出时候带宽不够用带来卡顿。理论上说越好的GPU需要的显卡带宽越高,这个甚至是没有上限的,特别是对于旗舰级的GPU显存带宽基本是100%处于饥渴模式,GPU运算单元一直在暴增,但前述的一些原因也说明了,GPU的显存控制器和ROP扩容相对要困难许多。我们在对GPU超频的时候,一般是核心和显存同时超频也是这个道理。显存频率和显存容量是两个息息相关同时在规格上要做到尽量平衡。显存频率太低,即使显存容量较高,由于带宽不足虽然存放空间充裕但GPU依旧得不到数据,如果显存容量太小,显存频率很高,则虽然带宽满足,但存储空间不足依旧会造成GPU的频繁等待,换来的还是画面的卡顿。我们知道7600GS 128M DDR3的性能要好于7600GS 256M DDR2,那么显存的大小到底多少才是合适的,如何结合显存带宽来看待这个问题?一些游戏在它的官方推荐配置里标注了显存容量,我们这个容量大致是怎么来的来看。一般来说游戏的材质库占用较大的显存容量,一个游戏需要的显存容量是游戏的厂商通过一个30帧或者60帧(视游戏类别的不同)的画面,考虑到可能采用到的全部高分辨纹理加上这个帧数下的高分辨率画面的帧缓冲来估算,一般不考虑高倍抗锯齿的情况。一般来说一个1080P的画面,算上高分辨纹理也不会占用512M以上的显存,特别是D9游戏,开启抗锯齿以后,像素部分的需求就会增大。由于高分辨纹理在新游戏中的可以说是暴力的引入,加之用户对抗锯齿性能的渴求,主流显卡的显存容量是越来越大了,一方面是由于高频颗粒的引入,另一方面当然也得感谢颗粒价格确实也不高,还有就是为D11游戏准备的。D11游戏的典型代表战地3,带来了华丽的光照效果,也带来了延迟渲染的广泛应用。为了能够在复杂光照下实现对画面的抗锯齿,MSAA这种前端像素的边缘抗锯齿已经完全找不到北了,于是就自然转换成了用于对付透明抗锯齿才使用的方式,那就是SSAA,而由于这种多光源环境这种SSAA几乎是全屏覆盖了,所以官方建议使用FXAA而不是MSAA。更主要的是这种暴力的SSAA带来的是对显存容量的渴求,以至于一些1G容量的显存都开始溢出,SLI/CF模式下需求则更大。这里给出GPU建议显存容量每64bit/8ROP搭配256M DDR3 或者512M DDR5 显存再高则收益极低。多卡互联TIPS:主卡显存容量未必如通常以为的那样需要远高于单卡模式,由于延迟渲染带来的抗锯齿帧缓冲压力是个特例。主卡负责输出,也就是说只负责副卡的输出而不参与副卡的那一帧运算,所以所存储的数据量并不大,仅以需要输出帧缓冲为主。某种意义上来说多卡互联方案应该优先考虑高位宽GPU,以避免开启抗锯齿以后像素输出出现瓶颈。由于副卡不负责输出,所以它的功耗也低于主卡,大约是主卡的70%,所以SLI/CF平台的显卡功耗并不是直接×2,而是略低,从这个角度说多卡互联的能耗比还是很不错的。未来,多卡互联方案会成为主流玩家都会考虑的配置方案,关于这一点的原因主要在于随着运算单元的暴增,线程的反派会愈加困难,而多卡互连会将一部分压力转移到CPU上。第二节:内核架构1.基础性的解释最早的统一渲染GPU并非G80,而是Xenos。是由ATI为微软的XBOX360开发的,这个为ATI后面开发RV600奠定了基础。其实由于ATI在单管三纹理上研发经验,他开发的统一架构就很容易偏向于SIMD结构。实际上Xenos拖累了ATI的研发进度,导致了G80推出的时候RV600的研发仍在中段,直至RV670才初步解决ROP问题。待此文创作之时,AMD的架构已经发生转换,所以只略微涉及R600的分析,而超标量体系则只分析NVIDIA部分,因为二者架构已经接近,没有必要再拆着说,对于VLIW的分析权且作为一种补充,这倒省了我不少精力。G80一个经典的超标量图形加速芯片,而且其规格和缓存设计都非常合理,整体效率很高,现在简单的以G80为蓝本来描述,其后穿插我认为有必要的新技术改进说明。

                                     所谓SIMD就是单指令多数据,这种技术也被应用于处理器的超线程技术。像素是由RGB三种颜色构成外加半透明处理,还会加上一个A通道,因此一个像素通常由RGBA四个通道构成,这里的四个通道就是一个向量,称之为4D。类似的例子还有三维坐标,通常是由x、y、z三个轴构成,有时候还会加上个w,也就是xyzw坐标了。因此对一个像素进行渲染就是处理RGBA四通道数值,依靠SIMD单元,1D-4D的数据都可以依靠单个流处理器完成,而且只耗用一个指令端口。这种设计有他的弊端,当面对纯1D指令环境的时候,这种设计的效率就会下降到25%,所以G80将其流处理器的频率提升至两倍核心频率以应对这个问题。而且这种对ALU的彻底分离,也对寄存器和指令端口带来了严酷的考验。从某种意义上来说G200和G110的性能都受到了指令端口的制约,单流处理器的执行效率反倒是G92最高。我在这张G80图片上标注了一些注脚,不过不太清楚
G80的核心主要构成如下:依托于crossbar交叉总线(其特点是较低的内存延迟和晶体管耗用,但相较于RINGBUS总线,其构建TPC数量方面则更显得困难,在多指令环境下也不如环路设计。Ringbus的固有缺陷在于对纹理压缩有着较高的依赖。ATI也在后来的芯片中放弃了这种设计。反倒是intel把它拾起来用在了CPU上,CPU毕竟单元较少,这样链接点数量也在可控制范围内。)G80构建了8个TPC也就是材质通道,每个TPC包含2个SM阵列,每个SM阵列内含8个超标量流处理单元,总共8×2×8=128个。这些流处理器是主要的运算单元,依靠分频技术运行于两倍核心频率上。每个SM阵列包含4个SPU(Special Function Unit特殊功能单元)单元对应着rcp,rsq,log,exp和lit指令 的处理,这部分很多都是函数向的,更主要是为了通用计算设计的。每个SM阵列包含8个纹理拾取单元和4个纹理过滤单元以及L1。纹理拾取和纹理过滤单元并非同步运行,因为二者的负载不同,纹理拾取要依靠缓存来和纹理定址合作,但依旧存在同步率的问题。总线上总共布置了6个64bit的显存控制器,每个显存控制器包含4个rop单元,同时每个内存控制器捆绑一个可编程片上缓存L2.这些设计都为CUDA运算打下了基础。NVIDIA在G80的研发上是非常超前的,(且不说那个时候黄仁勋演的一出好戏,拿出一个36渲染管线的样卡,并声称不打算转换到统一架构,戏耍了一次ATI),CUDA的研发始于2001年左右,也就是说在那时nvidia就已经知道微软有将GPU改进到shader主导的意向。NVIDIA超标量的优势就在于只要指令端口能承受首发压力,所有的单元都可以同时工作。G80的设计思路中,每一个SM阵列只同时执行一种shader指令,以减少线程分配对上游电路的压力,这和R600完全依靠一个超级线程端来统一调度是截然不同的。向量指令在SM一级被拆分给各个SP执行,SP拥有独立的寄存器和分派器。每一个TPC内含2个SM,同时拥有2个MP(multiprocessor 多线程处理器)每个MP具备warp(我们可以看作是端口),每个端口可以发射32线程,实际上是32粒子。这看起来很多,实际上高峰时期这个线程调度能力也就刚好够用,如果片上缓存容量不够就更悲剧。每个SM上有32K的页面是给MP用的,每个TPC还有32K的缓存,作为shared缓存,供应TPC内的SM共享数据。每个TPC 8KB Global memory和外加8KB Constant Memory(全局存储和常量存储),G80还有一个128KB的二级缓存,这一切都是为了指令的高效率分配。要知道GPU不具备CPU的分支预测能力,纯依靠一个具备512KB缓存的超级线程分配器根本无法满足如此规模的运算器的渴求(RV600 128KB RV970的时候是512KB)

taizer 发表于 2012-6-4 02:39

本帖最后由 taizer 于 2012-6-4 02:49 编辑

2.那些年我们追过的CUDA单元积和熔加运算(fused multiply-add,FMA),是CUDA基本力量之一。CUDA单元具备完整的整数和浮点单元,这种设计为CUDA实现FMA打下了基础。所谓FMA就是将乘法的结果和累加器 A 的值相加,再存入累加器。比如A=B×C+D通过FMA此类运算可以单指令完成,而且CUDA还可以将卷积、矩阵、点积等更加复杂的运算拆分成FMA指令在完成运算。如果从线程分配的角度来看,SM阵列中的CUDA单元在运算时实际被分成4个一组,这种设计至今未变。关于warp的线程数和CUDA的数量关系,放到后文来说。G200的主要改动就是每SM8SP,每TPC3个SM,共计10TPC,纹理单元扩充为80个。SM共享缓存扩充为16KB受限于crossba架构,TPC数量增加不易,而采用多SM阵列的方式,也是出于对线程分派器压力的考量。另外G200开始支持64bit的浮点运算,这个依靠多运算单元配合实现的,其实现方式反倒很类似于CPU。G80之所以被称为超标量,就是因为其SP单元是全功能单元,1D-4D指令皆可以由一个SP独立完成。当然问题也是有的,如果是4D指令,要么消耗4个SP来完成,要么一个SP运行4次来完成。所以还有是效率低下的情况.NVIDIA的应对办法就是采用分频技术,将SP频率提升到2倍于核心频率来运行。这个设计一直被沿用到费米时代,它的缺点就是一致了GPU本身频率的提高。当nvidia试图制造能兼顾科学计算和游戏的庞大核心的时候,往往会遭遇到频率提升问题,更主要的是它甚至影响到了显存控制器的设计。R600的问题R600的规格R600完全的SIMD设计,共计4个阵列,每个阵列16组SP,也就是64组,合计64×5=320个流处理器。每组SP由4个ALU和1个ALU.transcendental单元,于一个仲裁器共同封装。ALU.transcendental也就是全功能单元,在一些文章里称为胖单元。这每组SP只能同时执行一个VLIM5,而VLIM5要依靠UTDP来组合,而每个SIMD阵列所处理的线程列表也是由UTDP来提供,这个列表是完整的,同时列表上的处理类型可以是不同的,这也是它的优势所在。另外一个部分就是R600的的Z Compression压缩比提升到了16:1,设计目的是为了配合ringbus实现纹理的低占用和提升并发处理能力,双倍的Z-buff压缩也在这一代引入,这种高效的纹理处理优势一直保持到现在,即使后来的设计上双倍压缩并不一直在沿用。有趣的小设计:细分曲面技术在这一带ATI GPU中就已经有了,但并未引起重视。当时的游戏如果你开启细分曲面,由于API和游戏都没有原生支持,反倒会造成物体的变形,最为典型的就是硬线条的枪管会变的胖胖的。如果G80不是那么强大,R600也会成为一代经典(从命名就可以看出来,ATI想再现R300的大核心辉煌),当然糟糕的驱动和ROP问题也是存在的。R600的失败直接导致了ATI的芯片策略从R300时期的拼大作强转换到了小芯片策略,这非常成功,甚至近年来NVIDIA也转换到了这种策略。R600性能本身不俗,但问题是它极度缺乏中段产品。2600到2900之间完全是个真空地带,而8600GT到8800ultra之间塞满了8800GS 8800GT 8800GTS。虽然G80的良品率不高,但依靠屏蔽单元的做法,G80的产品线非常丰富,其成本平均下来也不那么高。而8800GT的表现就足够RV600喝一壶的状况搞的AMD很被动。这个问题即使在RV670时代也没有改善。RV670的全额模式也就是3850性能只能和8800GS相较,而3870依旧没有追赶上8800GT,之后NVIDIA的小芯片G94出现后,情况就更糟糕(研发G94是因为黄仁勋认为依靠G92阉割版来应对RV670实在划不来,他希望团队能设计一个小核心产品,改善纹理和ROP效率,以更低的成本来应对RV670)。看看当时3850的降价速度就知道了。也就是说RV670必须有极高的良品率才能在利润上有所斩获。根据当时的官方数据,全额运作的芯片大约在41%左右,而其中有8成可以运行在3870的频率上。反观NVIDIA,依靠冗余晶体管技术,G92能够达到8800GS规格的要远高于RV670,这一上一下成本就低了很多。AMD的UTDP Ultra Threaded Dispatch Processor(超级线程分派处理器)UTDP作为一个专门的全额的指令调度存在,其包含了全部了指令列表。由于GPU的处理不存在指令中断分支预测,这种顺序架构就对指令的分配和调度提出了极高的设计难度,特别是在处理单元数量暴增的情况下。UTDP将指令分为若干线程分派给各个SIMD矩阵,由于不能够进行中断和乱序,SIMD的仲裁器依靠交替分配来避免由于输出不同处理类型造成的空闲问题。UTDP作为一个总的指令列表,可以根据优先级依靠片上缓存临时跟换相邻的两个线程的执行顺序,如果下一个线程的优先级依旧很高,这个被攒搁的线程会被继续攒搁。而一旦有SIMD阵列空闲,这个线程会被优先发送,而UTDP仅有512K的缓存,一直都不够用。在转换架构之后,这单元实际已经没有用了,但依旧被保留下来了,我后面会说为什么。VLIW5的设计思路及相关问题每个SIMD单元内含1大4小5个ALU,一个仲裁单元和一个分支执行单元。其中那个大的ALU可以执行全部的SIMD指令,剩余四个必须和“大家伙”配合才能执行。通常都是通过指令分配单元进行组合后分配给SIMD矩阵。每个SIMD矩阵同一时间执行一个线程,分配给其内部的SIMD单元。最完美的情况下所有指令都被组合成5个一组分配给SIMD单元,实际的情况是,由于+vliw的先天缺陷,在指令序列器中只能尽量做到分配和组合成这种并行指令,加之每个矩阵的线程处理是同一类型,后面的数据要等待前面的处理完成,这种分配和组合根本无法做到100%满足SIMD单元。比如如果出现大量IN、COS、MULHI、MULLO、RECIP、SQRT ,ALU.transcendental不得不看着ALU闲着而自己来独立执行这些指令。而且由于实际的指令环境下很难找到4D+1D的完美组合,很多时候ALU.transcendental和ALU虽然双发,但ALU.transcendental只是在补完指令,并不起实际作用。也就是说虽然可以组合1D-4D的所有指令来处理,但所有流处理器不能同时工作么,比如在RV770的800个SP,任何指令情况下都不能全部启动。这个是由于它的指令表来自一个完整的指令序列表,必须按照类型顺序发送各种类型指令。在VLIW4后改进了这一情况。直到GCN架构,依靠分级的指令分发实现了MIMD的指令分发SIMD的指令处理架构,真正实现了流处理器的全额运作。当然Tahiti也有他的问题,由于SP数量的暴力堆叠,指令列表的压力已经非常大了,这个问题在Cayman 上也就出现了。其直接的表现就是单流处理器效率相较RV770时代没有提升。这个设计思路也并不是AMD没有看到这个问题,而在于SP的晶体管耗用度相对很低,而且采用暴力堆叠的方式可以快速的推出性能更高的新品占领市场。这个问题也同时出现在了采用超标量架构的NVIDIA GPU上。 从这个角度来说,超长指令架构对驱动的依赖也非常大。也正是因为这种设计,RV770在服务器的应用中更多的时候是作为向量节点。在RV770阶段,AMD已经为其每个SIMD阵列引入了 16KB Local Data Share,这东西的作用更主要的还是让其内部的VLIW5 内核共享线程数据,在过去只能依靠UTDP和显存取数,这也为后来AMD走向通用计算奠定了一定的基础。RV600的RINGBUS结构字面意思,环路。RV600的TPC和外总线之间,ROP和内存控制器之间,全是环路所以又叫双环路。RV770之后,TPC这一级的环路就取消了。双环路的优势在于,一个64bit的显存控制器,他采用的组合是32×2而不是64×1,形成更多的节点,配合内环路,如果不考虑高分辨材质的影响这种结构的延迟性能应该接近于512bit。可惜的是RV600仅有16个ROP还出了毛病,这个双环路只带来了高发热高晶体管耗用。
从GF100开始的新技术:Tesselation(曲面细分)曲面细分的基本解释就是,利用显卡的单元在原本的建模基础上,对三角形进行进一步的分割,从而实现更平滑的建模精度。目前的游戏引擎主要依靠纹理和光照来实现较高的视觉,而建模的精度提升相对于其他要素则要缓慢的多,其原因在于过多的顶点会给处理器带来较高压力。前面也提到曲面细分是原本就有的技术,直到DX11时代才真正被作为一项主要的画面改进技术,如果使用得当,应该不亚于全屏抗锯齿的意义。在GF100中,NVIDIA为每一个GPC配置了一个Raster引擎,每个SM配置一个PolyMorph引擎,这2个单元就具体负责细分曲面技术。
PolyMorph引擎顶点拾取 曲面细分 视图接口转换 属性设置 流输出在这5个步骤的进行过程中,每一个步骤的结果都交由PolyMorph引擎所在的SM阵列进行处理,处理后的结果交由下一个步骤,5个步骤完成后,细分曲面中的三角形分割也就基本完成,这个结果将被发送至所在GPC的Raster引擎。
Raster引擎即光栅引擎,在之前的GPU中,Raster所实现的功能是由其他单元实现的,其数量也仅有一个。包括PolyMorph的功能实际也是和现在Raster整合在一起,现在为了满足细分曲面的需要而进行重新的分割和组合,其位置也从前端进入到GPC和SM阵列,当然数量的提升也非常大。这是GF100曲面细分性能强大的关键因素。由于从本质上来说这并非是全新的模块,所以AMD就采取对原单元增加Tesselation步骤,然后分割设计的方式实现了对曲面细分功能的支持。现在的游戏对曲面细分的支持还不够广泛,未来如何做到广泛应用不而是滥用影响到性能也是个问题。
GPCGPC的设计特点:由于PolyMorph和Raster的进驻,而且纹理拾取和纹理过滤合并成一并入SM阵列,GPC在实际上已经可以独立完成一个GPU所要完成的所有工作,外围只要加上ROP和显存控制器就可以了。全新设计的GigaThread引擎由于GF100的MIMD特性较为彻底,GigaThread设计被用来满足多线程的应用。GigaThread有点类似超级线程分派器,主机接口把指令传送到GigaThread之后,GigaThread负责从内存向显存拷贝数据,之后GigaThread要把需要SM处理的数据创建成线程模块,然后分配给SM阵列,GigaThread还可以根据负责调整线程的优先度。SM内部的设计变化:GF100的SM阵列内含2个32粒子的线程调度器(Wrap调度器),且Wrap调度器之间无关联性,所以2个Wrap调度器可以同时执行,形成双发。每个Warp调度器下辖2个分派单元,同时SM阵列内含16个LD/ST单元,LD/ST将具体分配线程的去向。这些外围和SM阵列内的各级片上存储共同构成了SM阵列的线程和指令分配。(如果Wrap满载,则每个周期会有一个CUDA单元空载,此时寄存器满载。如果CUDA单元无空载,则Warp会出现部分空载,寄存器或者满载或者出现空载。从道理上来说是CUDA满载最好,但实际情况是Warp和寄存器都满载的时候利用效率最高,但同时处理的指令数量又是最少。很纠结吧- -!)纹理单元的设计:纹理单元的位置由原来的GPU变动到了SM阵列,使得其的频率脱离了核心频率的束缚,不过仍无法和CUDA同频。另外纹理拾取和纹理定址依旧采用分割设计,达到了4:1的比率。更主要的是,SM阵列和纹理单元的交互更加直接,之前纹理拾取和纹理定址的高速缓存也内置在了SM阵列中。片上缓存的设计不再赘述,理解成主要是分级设计就可以了,关键叙述起来篇幅太大,码字很累的。线程关联性软着陆在GK104的SMX阵列中,内涵高达192个SP单元,这个数量直接达到了GTS450所拥有的SP单元总数。这是一种SIMD的设计方向,在这样规模的SP数量下,必然会出现线程关联性的分割问题,也就是在AMD早期的GPU设计中会出现的问题。为了解决SIMD设计方向上的缺陷,GK104将线程关联性的分割交给了CPU来完成,而不是依靠线程分派器。所以在底层测试中GK104显示出了对CPU的较高依赖性,只是这种依赖性在游戏中的表现还不明显。根据目前的情况来看,NVIDIA下一步的设计思路及有可能是在GPU内部设计一个全新的RISC架构的协处理器,用以分担线程关联性分割的任务。


所谓执行ThreadSP所执行的最基本单元,也就是线程,在实际中就是像素的定义。CTA多个thread合起来就是CTA(线程块),Warp执行的就是这个东西。Block就是打包分配前的thread。由CTA组合而成。Grid在一个SM 阵列中可以同时执行多个Block,当全部Block中的CTA都被执行完成后,就进入了下一个循环。而这个循环中所有的Block合起来就称为Grid。GK104那些变化我在写这个东西之前并没有在意到这个变化,算写的过程中的收获吧。GF100/110的SM数据32CUDA、2个Wrap、4个指令分派、16个LD/ST、4个SPU、1个PolyMorph、4个纹理、64KB片上快取GK104192个CUDA、4个Wrap、8个指令分派、32个LD/ST、32个SPU、1个PolyMorph、16个纹理、64KB可分配片上快取CUDA核心负责像素、顶点、几何着色、物理计算等处理,指令分配单元负责线程群组的调度以及指令发射,载入与存储单元负责为线程计算源地址和目标地址,特殊功能单元负责执行抽象的指令,比如正弦、余弦、倒数和平方根,还有图形插值指令,PolyMorph 2.0引擎单元负责顶点拾取、曲面细分、视口转换、属性设定以及流输出等功能,纹理单元则负责纹理过滤、纹理采样、计算纹理地址并将数据输出至显存,而共享存储器和一级缓存是互补的作用,能够广泛地重复利用片上数据而减少片外通信量,从而提高工作效率。责纹理过滤、纹理采样、计算纹理地址并将数据输出至显存,而共享存储器和一级缓存是互补的作用,能够广泛地重复利用片上数据而减少片外通信量,从而提高工作效率。 G80时代随着统一着色器架构的到来而出现,成为继核心频率、显存频率之外的另外一个性能指标,后来一直延续到Fermi架构(近两年一般为核心频率的两倍,GK104回归同频)。纹理单元数量的扩充是因为阵列数量的改变所以单SMX拥有了更多纹理,但其他单元的数量改变确有蹊跷之处。以下的分析只是个人的推测,因为官方白皮书真正涉及到的有效的东西并不多。CUDA的数量扩容了6倍之多,指令分派器确和LD/ST确只扩容了2倍。一方面由于SPU单元数量的增加,一些特殊的运算可能就直接交由SPU来完成。另一个方面,我们来看。SMX的Wrap的实际thread数量仅有128个,这个数量和192个CUDA单元明显的不对应。这得从上面的所谓执行来说(或者胡扯)在执行 CUDA 程序的时候,每个SP对应一个 thread。每个 SM 则对应一个 block。每一个Warp对应2个指令分派器,每个指令分派器对应16个thread。如果我们把每4个CUDA看成一组,这其中有一个SP进行预读取或者等在一个FMA结果,那么每4个一组的CUDA一次4D循环运算会产生16个结果。这些预读取不能依靠片上缓存来执行因为这个量太大,而是同时直接消耗掉一个thread的执行来完成。这种情况下,GK104的Warp就会出现空载,而寄存器会接近满载。如果出现每4个CUDA,其中3个执行FMA运算,而另一个CUDA单元不需要预读取,则刚好用到8个指令分派器总共128thread,此时wrap满载。32个LD/ST也是刚好对应Warp空载时候的设计。这也就是前文说过的CUDA满载最好,但实际情况是Warp和寄存器都满载的时候利用效率最高,但同时处理的指令数量又是最少。从某种意义上来说,GK104满载执行时看作每SMX192SP,而执行最多指令时看作每SMX128SP。从演变上看,G80冗余,GF100半冗余,而GK104刚刚够。GCN架构中的可以说说的东西其实由于AMD转换到MIMD阵营,我本来不打算说GCN了,毕竟共性很大,而且码字又很累,是吧?但有个设计比较前瞻化,虽然NVIDIA也有这种设计,但AMD的意图更加明显。ACE全称Asynchronous Compute Engine,译为异步计算引擎。ACE位于整个GPU的最前端管理任务队列,它会将线程块规整的分发给后面的ALU团簇。ACE是所有GPU任务的起点,它的存在和表现直接关系到了GPU进行图形及通用计算任务是的效率表现。这个玩意就是干线程分派这个活的,目前和UTDP处于共存状态。ACE和NVIDIA的前端线程管理模块的区别在于ACE还负责几何部分。原本的GDS被放置在了每个CU中,而且这个容量达到了32K,何其爽也~那我这里为什么要把ACE提溜出来说。ACE在其设计上已经有了半拉协处理的样子,AMD实际上不仅仅在转换到MIMD,也在为下一个大的战役打下技术前奏。UTDP的保留正是为了和ACE在未来实现融合。由这里引出下一小节,也是最后一小节,也是最短的一小节:芯片策略。第三节:芯片策略2005年K8发售,2006年7月收购ATI,2011年1季度发布推土机,4季度发布南方群岛。而在这期间AMD依靠对K8的修补和工艺进步苦撑到现在,GPU部分则也是依靠对SIMD的架构不断修改。直到2011年AMD的CPU和GPU都迎来了架构的巨大变动,似乎是AMD多年磨一剑的爆发,但事实是无论是推土机还是南方诸岛其性能相对于竞争对手已经落后。AMD在干什么?为什么这2个新品的宣传费用还赶不上APU产品?这些年他的工程师团队在补番还是怎么了?(补遗:GCN的ALU在媒体上被只是被简单标注为1D单元,如果单从数量上看较GK104有很大优势,而且位宽也高出不少,为什么性能如此接近。实际上GCN的ALU设计依旧没有完全脱离原本架构,ALU.transcendental被移除,原本的ALU进化成向量处理器,但仍旧不是完整的整/浮运算器,部分浮点运算和函数要依靠SPU来完成。其二,ALU无法独立执行全部的标量运算,部分可独立执行,部分需要多个ALU合作。而且由于实际上还是向量处理器,所以部分标量运算时对向量寄存器依赖较大)实际上AMD在下一盘和大的棋,他的技术革命应该还有1-2代,这一代的产品依旧是保证存活而已。目前APU只是把CPU和GPU做到了一个芯片里,就异步计算的角度来说甚至还不如intel的核心显卡,人家好歹能共享下L3.APU里的CPU的运算结果不能直接给GPU调用,反过来也一样,放眼望去只是一个性价比产品而已。让我们再回头看看推土机。AMD没有去设计超线程技术,而是将处理器模块化实现多线程。实际上这种设计已经出现了SIMD的影子,而且这个架构很容易过渡到MIPS,没错那个隶属于RISC的MIPS。AMD下一步的打算应该是合并GPU和CPU这个他喊了很久很久的融合,合并的还有工程师团队。在未来的AMD产品里将只剩下APU这一款产品,而且将分为CISC和RISC两大系列。移动手持设备的蛋糕现在还很大,必然要做的。ACE和UTDP的设计经验将很容易帮助AMD进行这种合并的过渡。NVIDIA的小芯片战主流,大芯片走计算和发烧已成定局。当然这个2006年就收购X86团队的人向来野心不小。也许不用太迟,我们就能看到携带RISC协处理器的NVIDIA显示芯片,而这种设计思路则源自移动平台的耕耘。在这一点上,AMD和NVIDIA到是殊途同归。结语:耗时多天的3D王朝总算完成,我也了解了一桩事情,下一篇应该是关于CPU的,但根据我的尿性估计写完得一年多吧······作为PC的终端用户,我们的目的是希望产品越来越好越来越便宜,这一点上我们是相同的目的。而芯片厂商则希望产品利润更高销量更好。所以完全没有必要为了所谓的阵营吵来吵去。在北海公园的长椅上,坐着两个中年男人,水面上倒影着夕阳的余辉。坐在左边的这一位叫何国源,他悄悄的拉起右边这位中年男子的手,轻声的说道:我说仁勋啊,要不咱俩就在一起吧?右边的这位男子娇嗔道:轮家才不要跟你在一起呢~我这个人行文向来毫无节操,写这么一篇东西差点没憋坏洒家,写道这里才找回感觉。

taizer 发表于 2012-6-4 02:52

编辑还是比较混乱,看的痛苦的人,理解下我写的时候的痛苦吧。:'(

jwangh 发表于 2012-6-4 06:56

看到码了那么多字的份上一定要顶下的

zwhwow 发表于 2012-6-4 08:03

good,果断收藏

zz222252 发表于 2012-6-4 10:15

强帖留名{:3_153:}

ctuctuctuctu 发表于 2012-6-4 10:19

顶啊!!!技术性文章

ashuiashui 发表于 2012-6-4 10:21

写这么多字不容易啊

zmc5337 发表于 2012-6-4 10:25

高手啊,回头慢慢看

everysun 发表于 2012-6-4 12:18

不错,这个要支持!

zengpower 发表于 2012-6-4 13:17

科普啊,可以置顶的说

逐风、等待 发表于 2012-6-4 13:20

妈呀,已经晕了……看起来很深奥的说,果断收藏

ray.waltz 发表于 2012-6-4 14:18

看懂了一点点。。。反正知道光栅处理器和流处理器很重要了。。。

牛步垃圾 发表于 2012-6-4 14:24

学习了很多东东,谢谢lz大大:lol

taizer 发表于 2012-6-4 15:49

其实烂尾了,昨晚半夜2点多写到最后部分实在困了。也不想补充什么了,惰性是本性啊。如果有缘还有CPU,主板和显卡,机电产品3个分类。

t1000eva 发表于 2012-6-4 16:14

taizer 发表于 2012-6-4 15:49 static/image/common/back.gif
其实烂尾了,昨晚半夜2点多写到最后部分实在困了。也不想补充什么了,惰性是本性啊。如果有缘还有CPU,主板 ...

疯子呀~~写这些还不如和我一起玩游戏!;P

sukidayo35 发表于 2012-6-4 16:22

不错 顶了{:3_149:}

u576870 发表于 2012-6-4 18:14

学习了{:3_153:}

zeus945 发表于 2012-6-4 20:17

{:3_153:}好文,慢慢看。

殇不住流年 发表于 2012-6-4 22:11

技术啊!!

taizer 发表于 2012-6-6 17:00

做人真失败,写什么沉什么:L

houkeran 发表于 2012-6-6 17:25

太长。。留着慢慢看。。神人啊。。你是造显卡的吗?

怪蘇叔 发表于 2012-6-6 21:18

只看懂最后三句黑体的点我!

LQYJAY 发表于 2012-6-6 21:22

希望LZ能继续写出这样好的作品~~!

pcgamestome 发表于 2012-6-6 22:10

强贴,收藏之

u576870 发表于 2012-6-6 22:36


最后的黑体字。。。。。。{:3_56:}

w3924686 发表于 2012-6-6 22:42

看来最后要回归到简单指令集咯{:3_153:}

w3924686 发表于 2012-6-6 22:43

看来最后要回归到简单指令集咯{:3_153:}

zerosonic2 发表于 2012-6-7 12:06

技术贴我收藏了

s1120040434 发表于 2012-6-7 14:18

学习了 感谢分享
页: [1] 2
查看完整版本: 硬件百科全书之3D王朝---3D图形加速卡全解析