又是一年装修季
其实即便是喜欢研究原理的我,大多数时候也是这样想的。我会很自然的使用工具,而且在使用的时候不会考虑这玩意的工作原理是啥,因为潜意识里我也认为这些工具的工作原理跟生活不可能发生联系,他们是属于另一个世界的,物理和数学的世界里的东西。直到某天,我前座的元恺同学给我们讲述了他非常奇异的装修经历之后,我的想法完全被颠覆了——原来显卡的工作不是与生活一毛钱联系都没有,这一群晶体管的工作方式,并不是建立在什么高深的其他次元的理论之上的,不仅如此,显卡以及整个图形的过程,竟然跟生活中最普遍的装修过程一摸一样。
● 又是一年装修季
我的前座同事元恺在经过多年的努力之后,终于在首都购买了一套巴掌大的商品房。房子虽然不大,但每一寸都倾注着他的汗水和情感。元恺心满意足的打量着即将属于自己的房子,回想着这几年辛苦甚至还有些辛酸的艰苦买房之路,不仅鼻子一酸……当他一声长叹,想借此驱散伤感控制一下情绪的时候,房间里空旷的回音吓了他一跳——哦对,别光顾的高兴,这房子还没装修呢。
装修可是门需要细致对待的技术活,要认真的设计,充分考虑自己现在和未来的使用情况,把每一个细节都照顾到了,还要找一个优秀的施工队来干活,否则工程质量得不到保障的话,吃亏受累的还是自己。再怎么说这房子也是要住70年的,不好好对待岂不亏待了自己?
一切就绪,只待装修
元恺是个优秀的显卡频道编辑,这种优秀不仅表现在他平时的强悍的文章及评测中,更深深的融入了他的生活。他生活的一切似乎都跟显卡和图形有关,不信你看,就连他找的装修队都非常具有显卡特色,这不仅是一只拥有几十年经验的老施工队,甚至还有自己的队伍名——他们的队伍名,叫光栅化。
顾杰所写过的技术分析类文章索引(持续更新) | |
2、 忠实微软是否有用 A/N统一构架细节分析 | |
3、揪出幕后罪魁祸首 是谁拖累了统一架构 | |
5、融聚的未来在哪里 APU构架方向发展分析 | |
7、NV也玩融合 探GTX700核心CPU+GPU构架 | |
11、iPad2也成无尽陷阱?移动GPU构架全揭秘 |
装修队那点事儿
● 装修队那点事儿
光栅化装修队是一只威名远播的家装队伍,他们成立于80年代初,经过几十年的打拼,队伍从最开始的1人发展到了现在规模庞大的专业化队伍,队伍中每个成员都有自己的代号,很多师傅都身怀绝技,他们名字甚至都是传奇。
曲师傅代号TS,是队伍中负责房屋内部结构及特殊造型改装的行家里手。虽然刚刚加入队伍没多久,但是由于目前装修市场对房屋内艺术造型的再造业务需求非常旺盛,因此曲师傅很快就成了队伍里不可或缺的一份子。
与曲师傅代号相同的TS过程
向师傅代号US,专门负责为房间粉刷调漆,经过多年的磨砺和锻炼,向师傅已经从一个只会刷大白的小工成长成了拥有艺术家气息的职业调色师傅。现在向师傅不仅能够根据客户的不同需要精确地调配不同的漆料颜色,甚至还可以通过精确的调色和控制来接墙面彩绘之类的活计。另外,曲师傅加入之后跟向师傅的关系一直不错,向师傅在工作之余经常会帮曲师傅做一些力所能及的工作,他们纯洁的友谊已经成了团队协作的象征。
闻师傅代号TMU,是队伍创建之初就已经加入的元老成员,虽然闻师傅干的活都是些刮腻子啊铺地砖啊之类粗笨的活计,但长年以来勤勤恳恳任劳任怨,时刻严格要求自己,在队伍中一直享有很高的威望。近年来家装市场对质量和美学的要求不断增加,地砖的样式和品种急剧增长,闻师傅最近经常发愁,琢磨着怎样才能快速又准确的按照客户的要求从市场上找到地砖的样式并把它贴好。
舒师傅代号ROP,跟闻师傅一样也是元老成员,他要把向师傅调好的漆料和颜色刷到已经刮好腻子的墙面上,同时还要配合向师傅完成一些诸如墙面和地面彩绘之类的新兴业务。舒师傅在队伍中的工作量是最大的,整间装修最后的效果都要靠他来呈现,这直接关乎工程的质量以及队伍的名声,因此舒师傅的责任和压力是非常大的。
队长兼工头的姓名和代号都是个迷,现在只知道他叫吉师傅,他是队伍的第一名成员,有传闻说队伍刚成立的时候他好像绰号VGA之类的。吉师傅负责整个队伍的调度以及管理工作,同时吉师傅手下还有一众隐藏极深的外国小弟,没人见过他们的真身,只知道他们的协助极大地提高了吉师傅对整个队伍的管理能力,大家都叫他们cache、Thread Scheduler和crossbar什么的。
不得不承认,当元恺眉飞色舞的向我们炫耀他找到的这支传奇一般的装修队时,我们有一种恍若隔世的感觉——元恺,你确定他们是一支家装队伍么?这根本就是在说显卡嘛。
元恺神秘的对我们说:“这算什么?我不仅找到了这么一只装修队,还旁听了他们全部的装修前计划会。我跟你们说啊,他们不是名字神奇那么简单,听完了他们的会之后我才知道,原来装修的安排,竟然完全跟一块显卡的工作流程是一摸一样的啊。”
我们是这样计划的
● 我们是这样计划的
基本的家装过程是这样的,首先要对装修方案进行设计,按照顾客的要求将所需要的元素呈现在装修计划及效果当中,然后开始从外到内的施工过程,首先是外形改造及管道走线等涉及房屋结构变化的环节,接下来是墙面和地面的清理找平,之后是铺设地砖和墙纸,再来就是根据用户的需要和设计方案为其粉刷必要的颜色,同时对细节进行必要的处理,在结束这个步骤之后,装修基本上就算是完成了
作为准备工作的重要环节,光栅化装修队每次接活以后都会在开始工作之前进行准备会议,会上负责人会将任务分派到每一个工人头上,好让大家对自己的任务有所了解并进行相应的准备。元恺同志旁听的,就是这么样一个会议。
一个风和日丽的下午,元恺同学来到了与会地点——自己的新房,工人师傅们已经先一步到了,他们正围成一圈,听吉师傅布置任务呢。元恺同学悄悄地进了房间,没有人注意到他的存在。正当元恺憧憬着未来房间的样子时,会议开始了。
“这次雇主的要求一如既往的不可理喻,不过既然咱们装修队这么多年已经名声在外了,多难缠的顾客咱们都能搞定,大家要有信心。下面我来布置下任务——步骤还跟以前一样,先处理吊顶,门框,起槽走线什么的,由老曲负责;接下来闻师傅还是老样子,刮好腻子找平墙面地面,最后再把墙纸和地砖贴好;找平的时候向师傅还跟过去一样赶紧调漆,这次雇主的颜色有些‘错位’,调的时候多注意点;最后是舒师傅刷完房间,完了就可以交房了。接下来大家有什么问题提出来,一起讨论吧。”
敢说我的要求不可理喻?我不就是要了点……等等,他们这个工作流程怎么这么耳熟啊?
DirectX 11流水线过程
元恺同学不愧是显卡频道的优秀编辑,一瞬间他就注意到了事情的奇妙之处。装修的基本流程是房间结构处理、油漆颜色+墙纸地砖调整、以及最后的粉刷过程,这不是刚好跟图形流水线几何处理、像素及材质处理以及最后的混合输出流程完全一致么?
元恺同学开始兴奋起来了,最近他和同事正在筹划一个叫《GPU大百科全书》的连载,打算详尽的介绍GPU各个单元及部分的工作原理,还有整个渲染的流程,但一直找不到合适的类比对象来对图形专业的事物进行通俗的解释,正在为此发愁呢。现在,天赐的良机来了。
于是,元恺同学一瞬间就将“不可理喻”那件事抛到了九霄云外,马上掏出了小本,开始认真的倾听起了师傅们的讨论。
又是拱门又是吊顶,开曲面细分么?
● 又是拱门又是吊顶,要开曲面细分么?
元恺是个讲究人,横平竖直的门框和房顶显然不能满足他对美及品味得要求,所以元恺对装修队提出的第一组要求,就是将门框变成拱门的形式,上面最好还有一些浮雕效果,然后在给房间来一个形状非常难以形容的开放式吊顶。
用户就是上帝,不管要求多么离谱都必须予以满足,这是光栅化装修队几十年来屹立于竞争激烈的家装市场不倒的重要原因。因此,尽管元恺同学的审美比较脱线,但装修队还是决定超额满足他的要求,为他弄一个带浮雕花纹和大理石效果的拱门,这个任务责无旁贷的落到了曲师傅的肩上。
元恺想要的拱门及开放式吊顶
根据吉师傅的安排,曲师傅要先把原来的门框打掉,然后根据设计要求在门的位置上重新制作一个门模,以替代原有的房门结构,接着还要制作和安装新的吊顶。因为这是整个装修过程的第一个步骤,其他装修队的成员都还没有多少要紧事可做,因此向师傅很自然的来帮曲师傅一起做新的拱门。
“恩,他们之间有着纯洁的友谊嘛。”元恺对我们如是说。
在图形处理过程中,Tessellation单元又是做什么用的呢?GPU中的Tessellation单元所做的事情其实跟曲师傅没有任何区别,setup单元一旦将顶点连接完成几何结构的模型构筑,就等于房子原有的结构已经造好。这时候程序如果有更高的几何外形要求而需要更多的多边形,比如说跟元恺同学一样想要个带浮雕效果的拱门的时候,Tessellation单元就会根据需求重新生成新的顶点,并与Domain Shader一起将新的顶点放置到合适的位置上,以完成对旧有多边形的“碎裂”过程。
比如说一个三角形的中心放一个新的顶点,然后把它与三角形原来的顶点相连,一个三角形就变成了三个新的三角形。通过这种操作,模型的表面就有了更多的多边形,于是也就可以具备更加细腻多样的外形特征了。
“曲师傅干的活跟Tessellation单元原来一摸一样,我要的那个拱门和吊顶跟曲面细分的要求是相同的,都是不满意原有的外形,想要更好的几何细节,别看曲师傅是一装修工人,他的工作直到DirectX 11时代才被GPU以纯硬件的形式所实现,太神奇了。”
刮腻子铺墙纸的任务就交给TMU单元吧
● 刮腻子铺墙纸的任务就交给TMU单元吧
房间的墙和地面如果不平的话,一切装修都无从谈起,所以根据安排,在曲师傅处理完拱门的问题之后,TMU师傅就要对房屋的表面和地面进行一些处理。他需要在墙面上刮些腻子,以便能够找平墙面,同时铺上墙纸赋予墙面基本的颜色,对地面也需要铺好地砖,这样才能方便为整个房间构筑基本的外观,让调漆师傅有条件根据需求对油漆的颜色进行调整。
地砖和墙纸的来源部分会比较麻烦一些,因为元恺选择的是包工包料的装修方式,所以闻师傅还要根据设计需要去市场上寻找并购买合适的地砖和墙纸,再把它带回来贴在该贴的地方上。
“你们难道不觉得这跟纹理单元干的活一模一样么?闻师傅根据需要去市场上采购地砖,这跟纹理单元从材质库中抓取材质有什么分别?”
没错,TMU单元在GPU中的作用,就是对材质库以及显存中的纹理进行定址和抓取,程序员会预先烘焙好一些材质,这些材质拥有基本的色彩及形貌特征,TMU单元会根据几何表面的需要从材质库中定位并抓取合适的材质,以便构成物体表面的基本外貌,方便后续的Shader单元对颜色进行正确的计算,同时减轻整个渲染过程的压力。
一直以来TMU单元都是GPU非常非常重要的组成部分,快速的纹理贴图性能直接关系着GPU的表现。而闻师傅所要面对的情况是完全一样的,市场上有一大堆的地砖墙纸,只有一部分是符合装修需要的,TMU师傅需要根据需要去市场上寻找,找到之后再把它们买回来并贴在该贴的地方上。这个寻找和购买过程的快慢,直接影响着装修后续工作的速度。
定址,抓取,去市场寻找,采购……闻师傅,你不仅跟GPU里的TMU单元同名,连干的活都是一样的,这太神奇了。
雇主的卧室颜色要255.175.190的
● 雇主的卧室颜色要255.175.190的
元恺同学的眉飞色舞显然还没有完,接下来我们听到了更加震惊的事情。
“据说自从向师傅成长成了一名带有艺术气息的调漆师傅之后,他整个人都变了,在他眼中的所有颜色全部不再是简单的颜色,而是一组又一组的数字,每种颜色都对应三原色的混合比例,每种三原色的比例都会用一个0到255的数字去表示。”
“那不就成了RGB格式了么?”
“对啊,后来为了配合向师傅的工作,整个装修队在讨论颜色的时候都开始这么表述了。”
“那你房间要求的是什么颜色啊?”
“他们说我卧室房间的要求好像不太好调,但向师傅说他应付得来,而且打上光应该会很好看很温暖,颜色是255.175.190。”
作为男同事,我们对元恺同学的审美再次有了新的认识,因为255.175.190用现实世界的颜色来描述,是非常可爱的粉红色……
GPU对像素的处理是通过US单元来实现的,就好像房间的颜色是由调好的油漆颜色决定一样,物体表面的颜色细节也是由像素来决定的。像素的颜色通常由三原色混合来完成,因此其颜色值也可以通过3个不同的数字予以表示。
GPU的US单元会根据程序的需要对每一个像素的RGB值进行计算,不论光影还是色泽,最终都可以通过这些数值表达的颜色来正确的进行反映。US单元中的ALU在完成对RGB值的计算之后会把它传输给ROP单元与纹理进行混合,这跟向师傅把调好的油漆递给ROP师傅并把它刷在墙上没有任何区别。
“向师傅好像不光跟曲师傅关系很好,他跟舒师傅之间似乎也不一般,我听见舒师傅开准备会的时候跟向师傅咬耳朵,好像在说什么‘那家伙要的彩绘……回头你告诉我怎么画……有你帮我……太好了……’之类的,然后他腼腆的跟向师傅相视一笑,他们的关系一定不简单。”
我相信所有围观的听众同事们当时心里都有了点异样的不快感……算了元恺,为了进一步了解这么新奇的装修队,我们忍了,你继续讲吧。
他还要铺地板?那我们只有延迟渲染了
● 他还要铺地板?那我们只有延迟渲染了
我们说过,元恺是个讲究人,讲究这个词换个说法就是事多,东北话叫“硌瑟”。这不,他开始来事了。
“他们开准备会的时候,我忽然觉得地砖和房间的感觉很不搭配,所以我决定不铺地砖了,改换地板了。等他们开完会之后我跟他们说了一下,结果你们猜怎么着?他们当场就安静了。所有人都看着我,看得我直发毛,最后吉师傅才跟我说这很难办。”
“难办?地砖地板不都是铺么?”
“不一样的,如果是地砖的话,前面那个顺序是不变的,但如果换成地板的话,因为担心油漆会掉到地板上,所以地板一定要等墙面铺好墙纸并刷过之后才能铺。而且因为没有参照系,所以通常情况下铺好地板之后,墙面的颜色还会有些微的调整,这样才能让整个房间的色调达成一致。这直接打乱了向师傅的工作过程,他不得不改变过去的工作顺序和状态了。”
“这……听起来就像是延迟渲染啊……”
是的,又一个GPU渲染过程的关键步骤。延迟渲染(Deferred shading)会根据图形的需要,将光照之类的操作从传统的Pixel Shader前段直接转移到整个流水线后端的MRT(多目标渲染)里。这种延迟改变了shader操作的顺序,将其延续到了紧贴混合之前。尽管方向和目的不同,但这跟满足硌瑟的元恺铺地板的要求所导致的向师傅重新调色实在是有异曲同工之妙。
在经历了这一连串的冲击之后,我们开始怀疑,上帝创造家装事业以及图形处理过程这两件事物时,是不是提前把他们设定成了一对失散多年的孪生兄弟。
粉刷的活自然是ROP劳苦功高
● 粉刷的活自然是ROP劳苦功高
GPU工作的最后一步,是将经ALU计算好的像素同TMU单元拾取的材质进行混合,并将最终结果输出呈现出来。装修都到了这个份上了,我们觉得最后一步应该出不了圈子了,舒师傅干的活,就是ROP单元的功能:混合和输出,或者说——把颜色像刷漆一样刷到纹理上。
“最后,舒师傅接下了最重的活,他要把调好的漆料刷在墙纸上,因为我临时换了地板,在铺完地板之后他还可能要再刷一次,而且必须小心翼翼的,以免把我的地板弄脏。还有……”
装修中的刷漆
“还有?喂,你的要求来得多了点吧”
“其实也不是什么过分的要求啦,我只是……只是让他给我来一个墙面彩绘,造型也不难,不过是个阿部高和而已啦。”
阿部高和?你把这么危险的形象画在粉色的房间墙上做什么?还有,你管这叫“造型也不难”?
ROP单元在GPU中的主要作用,就是将全部像素填充进纹理,并使得纹理最终获得正确的表现效果。US单元所完成的工作虽然是对像素的计算和处理,但他并不涉及操作环节,这就好比向师傅调好了正确颜色的漆,却没有把它弄到墙上一样。油漆的颜色再正确也仅仅是油漆,如果没有舒师傅的粉刷,它永远都不可能变成房间的颜色效果。同时,通过舒师傅精心的粉刷以及彩绘,诸如阿部和高之类危险地效果也可以在墙壁和墙纸上得到体现,这与ROP单元通过混合完成一些特殊特效也是一致的。
前面的各个单元工作效率再高,如果ROP这边数量不够或者性能不佳,无法快速的完成混合以及输出动作,整个GPU的性能都会受到极大的影响。装修这边的话,前面几位师傅再怎么努力,舒师傅不刷完漆,这房间就算没装完。
本来就任重道远,再加上元恺这么个多事的家伙,我们不由得从内心中感慨——舒师傅您真的是辛苦了啊。
就这么定了,下礼拜进场!
● 就这么定了,下礼拜进场!
准备会开完了,这时候工人师傅们才注意到拿着小本傻愣愣的站在后面的元恺同学,此时的元恺不仅把小本子记得满满的,而且两眼放光的盯着诸位师傅,工人师傅们完全不理解元恺为什么一脸崇拜的看着他们。
“不就是装修前准备会么?就把这小子听傻啦?”
“可能咱们太专业了,把这小子镇住了吧,你看他还拿小本记录呢。”
“外行挺热闹,内行听门道,包不起他是个内行也说不定呢,拿小本可能是为了记下来好将来挑咱们的毛病。”
“真的?那咱们可得好好装,不能折了咱们的名声啊。”
吉师傅热情的拍着还在回味刚刚会议内容的元恺的肩膀,说你放心吧,装修队今天来仔细看过房子了,刚刚还仔细研究了一下你的要求,虽然要求有不少都有些……奇特,但你刚刚也听见了,队里的师傅都表示没什么问题。以光栅化装修队多年的信誉,我向你保证这次装修绝对不会出问题。算上准备物料等等的时间,我们决定下礼拜进场开工。
“从下礼拜开始,我一定每天都去盯着他们施工,把每一个细节都记录下来,回来之后用他们来对照GPU的每一个细节,你们就等着《GPU大百科全书》的出版吧。”
好的元恺,我们等着你。