视觉的颂歌
前言:GPU大百科的连载已经持续了6个月了,6个月前我们向你承诺过,虽然这是一本不算厚,不算旧,并未囊括古今天下之事,甚至还可能充满了各种谬误的“大百科全书”。但是我们相信,我们所撰写的这本GPU大百科全书一定会像ZOL显卡探索与发现栏目的其他内容一样,能够对你了解GPU和图形世界的各种现象,以及它们背后的本源提供一定的帮助,甚至还能引起你与我们思想的共鸣。
6个月后的今天,我们来完结这份承诺了。
GPU大百科的连载已经进行到终点了,在这6个月的悠长岁月里,我们带你游历了GPU的所有组成部分,或深或浅的了解了它们的作用、特色和意义,我们甚至还展现了每个单元的趣闻、轶事甚至是历史。我们为你展现了GPU的方方面面,现在只缺一样东西了,那就是总结。
来吧,是时候总结一下了。在这终章的时刻,我们会将为你再次梳理GPU每个组成部分的作用,将它们串联在一起的结果还有GPU本身的意义,如果你已经熟谙之前的各章GPU大百科全书的话,也可以选择直接跳转到文章的结尾部分,我们将在本章的第八页和第九页为你带来完美GPU的衡量标准以及是否存在的答案。
OK,Let's begin。
● 视觉的颂歌
我们首先要做的是梳理,长达6个月的连载时间不论是对你还是对我们来说都是一个艰苦而漫长的过程,我们会被这半年的生活所填满,被180余天流逝的时光剪裁,因此遗忘会让我们丢失掉很多有趣的细节——比如说,GPU执行图形流水线操作这个顺序的过程。
GPU大百科全书的连载顺序,基本上是按照图形过程在硬件中的执行次序来完成的。GPU在执行图形操作时所必经的步骤,是一个从几何过程开始,经由光栅化之后在完成材质及像素特效处理,最后由ROP混合输出的in order过程,我们把这个过程称作“33毫秒的咏叹调”。既然我们把GPU的执行过程比作了一曲关于视觉的颂歌,那么这个完整的in order过程中的每一个步骤,就是构成咏叹调的一篇篇乐章。
我们的梳理,将从第一乐章的几何部分开始。
● 第一乐章:几何处理
既然是“3D图形应用”,那么图形的几何处理就自然成了整个GPU流水线过程的第一步。几何处理实干什么的呢?很简单,就是帮你把描述图形的数学方程们转化成虚拟空间的“实在”的物体。
编程是一个与数学打交道的过程,程序员们并不能直接将脑海中物体和场景的形态画成一幅宫版画放在我们的面前,他们能够做的只能是将需要描述的物体表面的特殊关键点以空间坐标的形式加以描述,将物体外形的改变转化成这些点的坐标位置改变,再通过方程对这些坐标的运动加以描述,这样才能以一行行代码的形式完成游戏程序的编写。
将这些代码和方程转化成“可见”的图形,就是GPU进行几何处理的意义。
当游戏之类应用开始执行时,GPU中首先“动作”的便是几何部分。CPU会根据程序的内容将程序员们准备好的程序语言翻译成虚拟的点,几何单元则通过将这些点描述到虚拟空间中,再通过将这些点相连来构成要描述物体的外形特征。
在完成了模型确定之后,GPU还会根据程序需求以及自身能力不同对模型表面进行处理,包括Vertex Shader、Geometry Shader以及Tesselation等等诸多操作,他们的作用都是帮助确定模型的最终形态以及对其进行表面细节的修饰。在完成这些修饰之后,物体和场景的几何外观就确定下来了。
几何处理时图形化的开端,它欢快,雀跃,充满着变化的活力和律动。我们有关几何单元的故事写在遥远的初夏,所以点击这里应该有助于帮你回忆起其中的点点滴滴。
● 中场的独角戏:光栅化
我们说过,虽然3D图形应用是围绕着创造立体感视觉体验来进行的,但在GPU里能够称得上是立体空间中进行操作,只有几何单元一部而已。之所以几何之后再无几何,只因为我们所有的屏幕,全部都是“平面”的……
光栅化过程
透视特效,是作画过程中常用的在平面范围内表达立体视觉感的基本手法之一。既然我们面前的屏幕都是“平面”的,无法用来“真正”表现景深等视觉信息,那么将空间立体物体图形转变成具有透视特效的平面图形,就成了在目前的显示设备中表达立体感的唯一出路了。
而这,也就是光栅化过程最根本的目的。
当然,除了达到平面透视效果的目的之外,针对颜色处理所需要的像素化需求也是光栅化操作的主要原因。所以当几何单元完成了对物体及景物模型的确立以及修饰之后,GPU中的Rasterizer会将立体模型进行一次三维坐标向二维坐标的变换,物体经由Rasterizer的处理,被从虚拟的立体空间“投影”到了平面空间,其原本所具备的Z值也就是景深值,将仅以数据的形式临时存放在Z-buffer中以备后续处理使用。完成这一步之后,原本空间存在的物体将完成与屏幕中像素的对应,其后的材质及像素操作也将随之展开。
Rasterizer是收割生命的死神,因为它将凝固几何模型,令其失去活力并变得不再可以进行操作。Rasterizer又是创造新生命的天使,因为经它处理之后的模型才能进行后面关于颜色的丰富多彩的操作。光栅化所进行的坐标变换同时兼具了万物归于寂静的沉重庄严以及预示新开始的平和与期盼,如果你想再次领略死神的镰刀和天使的羽翼,可以点击这里。
● 第三乐章:材质操作
在完成了坐标变换操作之后,平面化的图形将迎来关于颜色的相关处理,这些操作中首当其冲的自然关于表面色彩的部分了。因此GPU执行的图形过程便来到了相当传统同时也是必不可少的环节——材质操作。
ID Tech5独有的MegaTexture技术
材质操作的本质其实非常简单,依旧是由于编程本质的原因,程序员们并不能用意念直接为我们呈现画面,所以他们会将自己想要表达的东西以代码的形式分开描写,GPU将这些代码翻译出来之后再根据要求进行“组装”操作。材质的操作,就好像服装店将分开运过来的大小款式不同的衣服穿到尺寸各异的模型人偶身上一样。
程序员们会事先制作包含很多色彩和图案的材质库,每片材质都会有规则的可以坐标度量的尺寸。接下来,他们还会在程序中为物体表面规定好特定的色彩和图案特征以及适应类别范围。当光栅化完成之后,每个多边形新具备的坐标将成为确定它“形状”的新参数,材质单元根据事先规定好的特征范围去材质库中进行查询,然后再根据形状参数确定预制材质中截取的部分,最后把这些材质拷贝出来覆盖到对应区域之上,这就是材质操作的全部内容。
这种通过预先烘焙材质,然后以材质库寻址—定址—拾取来完成为物体赋予色彩及图案细节的操作方式不仅简洁,而且为硬件高效的赋予物体表面细节创造了条件。GPU不需要“生成”新的东西,只需要把原来准备好的东西找出来放到合适的位置上去即可,这种明快的操作方式让材质单元成了3D图形应用的“开国元勋”。
材质操作一改光栅化的沉重,再次将图形处理的乐章引入了轻快悠扬的旋律中。但伴随着人们视觉需求的不断增加,对光影真实度的要求将单纯材质操作死板、不可能预测并制作出所有镜头可能性从而无法反映实时动态效果的弊端暴露了出来。于是,人们为材质操作引入了宏亮的和声——Pixel Shader。
● 宏亮的和声:Pixel Shader
Pixel Shader单元出现的原因其实非常直接——光栅化处理过程并没有真正的光线存在,那么对光线与物体作用特效的描述,就只有通过创造“被光照射后颜色发生变化”的像素这样的方式来完成了。材质的本质,其实就是像素的集合,既然我们预先制作的材质并不能充分地反映出现场真实的光影效果,那对其进行修改不就好了。
经过精心修饰的像素效果
我们面前的所有颜色,归根结底可以通过红绿蓝三原色以及它们的混合来表达,而三原色的深浅以及混合程度,又可以通过三组数字以及它们之间的关系来表示。因此对颜色本身、它们与光线以及他们彼此间相互影响的描述,完全可以被直接看做是对数字的近身缠斗。
想要控制并且实时正确的描述颜色说起来似乎不难,做起来却并非易事。在传统的不可编程渲染流水线中,一旦像素进入了流水线,程序员们就失去了对它们的控制。为了能够将正确的带有交互关系的颜色以程序的形式表达出来,程序员们发明了可以根据场景需要在光栅化之后用实时演算的数学方式改变像素颜色的方法——Pixel Shader。
当空间模型完成坐标变换及像素化之后,材质单元进行动作的同时Pixel Shader也在全力开动。根据shader programe的需求,ALU会按照程序员提供的数学关系以及要求对特定像素的RGB值进行对应的计算和更改,这些数学关系和要求基本上都涉及对原始材质进行“更改的部分”。透过改变这些像素的最终颜色,人类在Pixel Shader单元出现之后终于达成了实现表面光照反应、次表面/界面间发生的半反射、散射以及折射等等传统贴图很难实时随意且正确呈现的视觉效果的目的。
读到这里,相信各位不难看出材质操作与shader之间的关系了。对物体表面的描绘来自shader/ALU与材质单元共同作用的结果,材质操作无法对高自由度场景以及物体的光影以及光线关系等效果进行实时正确的描述,而Pixel Shader又只能对像素进行修饰而非实时的创造,要想实现正确真实的视觉效果,两者在目前来说显然是缺一不可的。如果说材质单元是图形过程中重归轻快悠扬的第三乐章,那么Pixel Shader就是该乐章中宏亮同时感人至深的和声部分。
● 咏叹:ROP
我们说过,图形处理就是通过编程将一个图像拆分成若干个基本组成部分,再交由硬件进行合并和表达的流水线作业过程。从几何处理开始,到后面的光栅化,再到材质操作和Pixel Shader操作,图形流水线按照严格的顺序一步一步的完成了构成图像的基本组成部分的“制造”过程。当所有有需求的像素都被处理完毕之后,最后的工作就是把它们合并在一起了。从事这个合并工作的,就是位于图形流水线最末端的ROP。
位于图像处理过程最后一步的ROP
ROP单元对图形元素的“组装合成”过程分为以下几步:首先,拾取好的材质以及由shader处理完成的像素会被传送到对应的z/stencil buffer,ROP单元会对这些纹理和像素进行z/stencil检查,尽管经由光栅化处理之后的模型已经不具备实际存在的Z轴了,但其深度信息依旧会被保存在Z-buffer中,对于深度和模板信息的判断能够让ROP做出让哪些像素被显示出来的决定,这不仅能够避免完全遮挡的像素被错误的显示在前面,同时也能够减少后续的color output部分的压力。
当所有像素都完成了深度检查等操作之后,特定范围深度值的像素将被输送到alpha单元进行透明度检查。根据程序的需要,ROP会以Blend单元对特定的像素进行alpha Blending操作。经过上述步骤之后,剩下的像素将会被填充进2D化模型需要的范围内,也就是我们常见的Pixel Fillrate过程。
由于像素上的效果已经被shader以数学的形式处理完毕了,因此如果没有AA操作,那么到这里为止图形渲染工作就算彻底完成了,所有效果的混合及填充将会让正确的画面最终得以呈现,这幅完成处理的画面会被送入output buffer等待输出。而如果程序要求进行AA操作,比如MSAA,那么ROP中的AA单元还需要对填充完毕的画面进行若干次多重采样,然后再对采样出来的像素点进行color Blending操作,完成之后的画面才会被送入帧缓存等待输出到屏幕上。
ROP单元对于GPU来说是不可或缺的组成部分,它负责着图形过程中图像元素向画面的最终跨越。混合像素并输出这一特性,让它的性能直接决定了画面输出的速率,进而影响到整个GPU的实际性能表现,它甚至还是桌面GPU维持自身地位和荣耀的重要标志。作为整个图形流水线的最后一步,ROP完全是图形乐章最高超的咏叹调。
● 串场:缓冲体系
作为GPU大百科全书中唯一出现的非处理性单元,缓冲分布在整个GPU内外,虽然它们并不直接参与任何运算和控制动作,但却担负着提升GPU执行效率的重要使命。
现代GPU的缓冲体系十分庞大,它包含了由体积、延迟及位置决定的4个主要的组成部分,分别是显存(Memory)、纹理缓存(Texture cache)、共享缓存(shared)及寄存器(Register)。显存置于GPU芯片外部,通过GPU内部的显存控制器进行控制和操作。纹理缓存、共享缓存及寄存器则集成在GPU内部,分别供TMU和ALU控制及使用。
GPU缓冲体系
显存作为缓冲材质等大尺寸信息的场合,一直以来都是显卡中最引人注目的性能指标之一。几乎与显卡同时出现的显存在经历了上古时代的EDO-RAM(Extend Data Output DRAM)甚至是FP-DRAM(Fast Page DRAM)向SDRAM的转变之后,其发展进入了GDDR的快车道。目前的中高端显卡多采用GDDR5显存,频率维持在4000MHz~5000MHz的范围内。充足的显存容量和显存带宽,是保证GPU材质性能以及最终渲染性能的重要要素之一。
和显存不同,由于显卡最初的工作并不涉及材质工作,所以纹理缓存的历史远没有显存来的悠久,它是在图形效果发展带来的纹理尺寸迅速增加之后才应需求出现的。诸如mip-mapping以及Generating Lightmaps之类的复杂纹理和操作也被更多的使用在了图形效果的表达过程中,这些操作让TMU获得一套更加快速有效的暂存系统的愿望变的迫切起来,于是纹理缓存便开始充当显存到TMU单元的有效缓冲了。
Shared的出现则要更晚一些。当图形API进化到DirectX 10之后,ALU面对的运算环境发生了本质的变化,大幅增加的运算灵活度要求硬件能够为ALU提供一个方便调用且独立操作的临时暂存空间,于是Shared便应运而生了。Shared只读不可写,它只需要为ALU临时释放结果提供服务即可。Shared的出现对Shader的执行有一定意义,但更多的作用还是在于通用计算及通用计算参与的后效处理领域。
寄存器同显存和cache一样,都是发源于CPU的重要缓冲组成部分。长期以来,寄存器都伴随在运算单元旁边,以最及时的延迟和最大的带宽为运算单元提供着指令寄存空间(IR)、程序计数缓冲(PC)以及累加器(ACC)等多方面的服务。寄存器具备最高的运行速度以及0t延迟的特性,其极高的晶体管成本令其在体系中的总量非常少。
缓冲体系虽然不是直接的运算及控制单元,但它们扮演着通过缓冲数据流来掩盖体系延迟的重要角色。它们并不是歌者,不具备一展歌喉并博得满堂喝彩的能力,但它们穿插在歌者之间的串场却能将演出的气氛很好的维持下去。无论是显存的溢出或者带宽不足、纹理缓冲的拖沓还是Shared的表现不佳,都会给不同图形过程的执行平添更大的延迟。
● 33毫秒的咏叹调
在脑海中创造完美的事物并予以表达是人类思维重要的组成部分,虽然我们的整体想象力近乎于无限,但如何将这些想象以具相的形式表达出来却一直都是困扰着全人类的难题。我们并不具备心灵感应、意念力或者其他什么英雄漫画中经常会露脸的能力,为了表达想象中的景物,我们一直都只能通过双手在各种地方作画、雕刻、堆砌乃至是构建了一个又一个宏伟的建筑。这种状态持续了几万甚至几十万年,从我们刚刚从树上爬下来的上古祖先开始,一直到计算机图形学的出现为止。
绘画曾经是想象力最重要的表达手法
在计算机图形学以及图形流水线中,一切的一切均与数学有关,它们的出现让人类第一次拥有了将想象力以数学这一通用语言的形式表达出来的可能。而GPU的出现,则将数学、想象与现实这三者直接的联系在了一起。有了这一实际的执行者,在程序中以数学的形式去表达想象力以及背后的艺术,然后借由GPU的动作将之最终展现出来,成了人类延展自身思维极限的一大重要途径。
那么GPU究竟在做什么呢?
人类的视觉系统相当特殊,当眼前的画面以大于每秒24幅的速度更新时,视觉残留现象会让我们认为这些单幅的画面变成了连贯存在的动画。在现代显示设备中,这一数值被进一步放宽到了每秒30幅的速度。换句话说,如果我们希望将脑海中想象的东西以连贯的形式表现出来,或者我们希望接收别人传递给我们的想象时,如果能够达到每秒30幅画面的更新速度,我们就能够看到与自然发生的事物并无二致的连贯表达。
要输出每秒30幅画面,每幅画面的创作时间不能高于33毫秒。一切图形的美或者说想象之美,都必须在这33毫秒内完成。
随着数学手段和编程水平的不断提升,我们能够实现的图形元素,以及由它们组成的单幅画面的正确度和真实度正变得越来越高,但如果想让这些画面变成流畅的连贯表达,GPU必须以低于平均33毫秒的延迟来完成这些画面。我们前面提到的所有图形元素,它们从数学语言中被翻译出来,分别搭建完成并组装在一起的过程,总用时不可以超过33毫秒。
这就是GPU的咏叹调,一曲不断丰富和强化着每一个乐章,但却永远不能超过33毫秒的咏叹调;一曲我们用了6个月时间,耗费无数精力希望展现给你的咏叹调;一曲将持续到计算机虚拟现实消亡那一天为止的咏叹调。
● 拒绝被打断的华彩的乐章
我们已经知道了图形处理过程的特色和诸多细节,那么接下来的问题就很自然的显现出来了——究竟怎样的GPU才算是优秀的GPU呢?为何不同的GPU构架执行图形的效率不同呢?为什么我们经常提及的先进以及落后的图形构架,在游戏中的实际测试差距并没有理论上那么巨大呢?
GPU的最终目的,在于顺序的执行几何处理、光栅化、材质、Pixel Shader以及混合输出这5个部分的操作,每一个操作都会带来相应的长短不一的延迟,而这些操作的总延迟被限定在了小于平均33毫秒的狭小时间范围内。如果某一帧画面中某个组成部分的渲染延迟过大,导致该帧画面的总执行时间大幅超越了这一范围,而其他画面的执行过程带来的时间差又无法弥补这个损失的话,最终反映到我们面前的最直观体现,就是画面更新速度的瞬时大幅下降,也就是最低帧(min FPS)的出现。
最低帧对帧数的平滑度影响甚大
这种忽然放慢节奏的画面更新状态虽然持续时间通常很短,但却能因最低帧程度的不同直接影响我们感受到的画面流畅度。被忽然打断这件事,相信对任何一个人来说都不会是愉快的体验。也正因为最低帧的持续时间通常很短,才导致了在以收集平均帧数为目标的常规游戏测试中很难得到充分体现这个结局。
依想象力和表达能力不同,对于特定的编程者来说,构成图形处理过程的5个组成部分的意义和所占比重也不尽相同。有些编程者倾向于完美的模型修饰,有些编程者则喜欢真实、复杂同时灵活的光影效果表达,还有些编程者喜欢精雕细琢每一个细节,最后通过巨量的图形元素来构筑完美的图像,这些风格上的差异,为编程者带来了不同的硬件需求。
如果这些编程者的需求如果无法从硬件中得到满足,所产生的必然结果便是最小帧的出现。因此,具备广泛的适应性,能够迎合编程者表达真实视觉体验的需求,以均衡的构架搭配来尽可能地消灭总执行延迟大幅超越33毫秒的最低帧事件发生的GPU构架,才能被称作是优秀的GPU构架。
均衡二字并不复杂,但要想真正做到却又谈何容易。几何单元的配比和构成、材质的拾取速度、Shader的总吞吐能力以及灵活执行能力、ROP单元的输出效率还有缓冲体系和构架宏观结构提供的延迟掩盖能力等等要素必须同时得到照顾,如果其中任何一个甚至是多个要素出现了偏差,都会影响到我们或的连贯画面的过程。
NVIDIA与AMD图型构架细节对比
这世界上有完美的GPU构架么?很遗憾,没有,即便是最新的GPU中也没有。NVIDIA的Fermi在几何端、ALU灵活度、高速片上缓冲体系以及构架的宏观并行度等方面非常均衡甚至接近完美,但并不出众的材质资源密度以及相对较小的显存体系影响了它进一步释放性能的张力。AMD的Cayman在吞吐能力,材质处理能力以及显存体系尺寸方面十分出色,但其他方面却又乏善可陈。再加上家用机平台干扰导致的极度鱼龙混杂的PC游戏编程界现状,我们所能够做的,似乎就只有在较小的最低帧以及较大的最低帧之间进行选择而已了。
当然,虽然现状并不完美,但我们也无需因此而失望甚至绝望。GPU用十余年时间谱写出了宏大的发展史诗,期间虽然存在诸多错误甚至是倒退,但在追求完美视觉享受这一方向的指引下,其整体前进的步伐是没有改变的。每经历一次发展和更新,我们距离能够消灭最低帧的均衡图形构架都会更进一步,相信在不久的将来,我们一定能够看到真正完美的GPU的出现。
● 尾声:百科的最后一页,余音悠长
6个月前的那个初夏的夜晚,当我敲击键盘打出GPU大百科全书这几个字时,包括我在内的所有人都不会想到这几个字将会成为一次绵延近200天的漫长旅程。其实最开始我们筹备GPU大百科全书时的想法非常简单,其目的仅仅是为了纠正大量网上资料中对于GPU各部件注释以及介绍里出现的荒谬错误。“GPU这玩意很简单啊,不就是几个单元放在一起通上电就能在屏幕上显示图像的东西么,介绍起来很简单啦”。但当我们敲击起手中的键盘,想要“简单的介绍一下”GPU时,我们发现自己错了。
第一期GPU大百科全书的“封面”
我们创作和阅读了无数篇关于GPU的功能、GPU的性能、GPU的构架、GPU的性价比甚至是GPU大小的文章,我们从GPU中获得了游戏娱乐的享受,我们每天好像都在为了自己喜爱的产品与别人在网络中争吵,我们购买了无数块GPU,同时也丢弃了无数块GPU,但我们似乎从来没有问过自己这样一个问题——
GPU,究竟是什么。
我们为究竟为何采购GPU而迷茫,因为我们并不了解GPU,我们只知道它是一个可以用来娱乐的工具。我们为GPU高昂的售价而彷徨,因为我们并不理解GPU,我们只知道它在掏空着我们的荷包。我们在为了GPU的争吵中不断地撒谎,甚至不惜以捏造和谩骂的方式去尽情的攻击与我们意见向左的人,因为我们并不是出于尊重GPU的存在,仅仅是为了满足自己的被认同感而已。我们甚至不认为GPU是我们生活的组成部分,它只是一个一闪而过的电子产品。
GPU,究竟是什么?
GPU是人类想象力的延伸,它越过了大自然对人类表述能力的束缚和限制,将我们脑海中任意奔放的涌动转化成了眼前真切存在着图形。在它创造和主宰的空间中,我们可以看到绮丽的风景、看到惊险和刺激,看到一幕幕交织在一起的爱恨情仇,甚至看到我们内心的丑恶和阴暗。凭借GPU,游戏制造者们将他们内心深处的激情和想象完美的呈现在了世人的面前,并且张开了双臂欢迎所有愿意的人们加入到这激情当中。如果没有GPU的存在,我们甚至可能永远都无法与自己想象中的画卷发生哪怕一毫秒的直接联系。
GPU是凝聚了无数人的无数汗水、劳碌、挫折和雀跃而产生的产品,创造者们人性层面的特质像烙印一般深深地刻在了GPU的灵魂深处。GPU各部件的工作需要完美的团队配合协作才能完成,GPU的高效工作需要缓冲作为调整才能得以实现,甚至GPU之间的争斗,也如同我们彼此的争斗那样充满了尔虞我诈和你死我活。
GPU是一名歌者,它用自己33毫秒的咏叹调向造物主展现着人们挑战自然并展露自我本性的决心。GPU又是一面镜子,它让我们在使用的沉淀和回味中重新审视了自我。
正因为GPU有这样多不为人知的内涵,我们才决定将一个原本非常简单的说明书式的小科普选题一口气放大成了一组十余万字,绵延6个月的长篇连载。我们在每一期的大百科全书中都会竭尽所能为你展现最真实的GPU部件,不仅包括它们的功能和特点,更包含了它们彼此之间的联系,它们的历史和未来,甚至还有它们的故事和传奇。我们这样做的目的,就是为了在向你介绍GPU的同时,给你“GPU究竟是什么”的答案。我们觉得GPU有资格让人们了解这一切,人们也应该了解这一切。
GPU大百科全书完结了,尽管数不尽的不可抗力让它留下了很多未能言尽的遗憾,作者肤浅的水平和拙劣的表达方式也给不少人的阅读造成了困扰,但我们仍然相信这本妄自尊大,敢于自命为“大百科全书”的东西最终替GPU说了一些该说的话,同时也让更多的人了解了GPU的方方面面。我们做到了当初的承诺,可以长长地出一口气了。感谢所有陪伴我们走过这6个月艰苦岁月的人们,没有你们的支持,这个连载几乎不可能进行下去。谢谢你们。
一千个人眼中有一千个哈姆雷特,我们眼中的GPU,未必就是你眼中的GPU。所以GPU大百科全书的完结,并不代表着GPU传奇的完结。它们正躺在你的机箱里,静静地等待着你的发掘更多的故事呢。