GPU百科全书(6)谁也离不开的缓冲

房子分大小,缓冲分等级


  前言:时隔一个月,GPU大百科全书又回来了。在之前长达三个多月的漫长连载中,我们一起按照工作顺序走过了整个GPU的流水线,相信在经历了这次辛苦的旅程之后,屏幕前的你多多少少都会有所收获了吧。

  我们在上一期GPU大百科全书的结尾曾经说过,工作单元游历的完结并不代表着GPU大百科全书的结束,因为除了我们见过的这些功能各异的运算/操作单元之外,GPU中还有这一群数量庞大且作用极其重要的“幕后英雄”。它们分布在整个GPU内外,虽然并不直接参与任何运算和控制动作,但却担负着提升GPU执行效率的重要使命。它们就是GPU以及整个显卡最重要的组成部分——缓冲体系。


GPU百科全书(6)谁也离不开的缓冲_第1张图片

  缓冲对于这个世界来说是至关重要的存在。工厂里的堆料车间是缓冲;城市里的停车场是缓冲;学生们做题时的草稿纸是缓冲;甚至当你被沉重的工作压得透不过气来的时候,放下工作去睡上一觉也是缓冲。缓冲可以为连贯任务的执行提供极大的帮助,甚至还能为执行单元更好的动作提供先决条件。对于GPU这一大并行度的运算执行体系来说,通过合理的缓冲设置来临时挂起和快速存储数据,不仅有助于数据的快速存储和结果的转移,更可以掩盖延迟造成的执行断档。

GPU百科全书(6)谁也离不开的缓冲_第2张图片
辅路可以为城市交通提供缓冲

  要说缓冲体系完全躲在幕后吧,其实也有点冤枉。这些幕后英雄中有一位曝光率极高,甚至到了人尽皆知的地步。但对整个体系来说,润物细无声才是形容它们最好的词汇。今天,我们就来见见这些平时不怎么露面,但却能够影响GPU性能的朋友们吧。

  ● 房子分大小,缓冲分等级

  现代GPU的缓冲体系十分庞大,它包含了由体积、延迟及位置决定的4个主要的组成部分,分别是显存(Memory)、纹理缓存(Texture cache)、共享缓存(shared)及寄存器(Register)。显存置于GPU芯片外部,通过GPU内部的显存控制器进行控制和操作。纹理缓存、共享缓存及寄存器则集成在GPU内部,分别供TMU和ALU控制及使用。

GPU百科全书(6)谁也离不开的缓冲_第3张图片
GPU缓冲体系

  在整个缓冲体系中,显存的体积是最大的,大到只能将其独立到GPU芯片之外。作为缓冲体系中最重要的组成部分,显存的知名度已经高到一提显卡必定提到它的地步了。相对于显存,缓冲体系中其他三位成员的名声不仅矮了一大截,甚至都不为大多数人所知晓。尽管在整个缓冲体系中显存并不是需要投注最多设计资源的部分,其作用也并不比其他三者更加突出。但在很多消费者心目中,显存的快慢和大小几乎是影响一款显卡身份和地位的唯一标准。对于GPU及整个显卡体系来说,显存就像是一个巨大的仓库,材质也好,指令也罢,几乎所有涉及显示的东西都能装进去。

  我们今天的故事,就从这最大的仓库开始吧。

 


顾杰所写过的技术分析类文章索引(持续更新)

1、谁是微软忠实随从 A/N统一构架历史回顾

2、 忠实微软是否有用 A/N统一构架细节分析
3、揪出幕后罪魁祸首 是谁拖累了统一架构

4、 曝你不知道的DX11 解析GPU通用计算妙用

5、融聚的未来在哪里 APU构架方向发展分析

6、特效消耗是无尽陷阱?游戏画质现状解析

7、NV也玩融合 探GTX700核心CPU+GPU构架

8、分裂帝国的统一之路 Intel融合构架探秘

9、上错花轿嫁对郎 CrossFireX超高效率揭秘

10、口袋里的战争 移动世界3D芯片构架演义

11、iPad2也成无尽陷阱?移动GPU构架全揭秘

12、GPU大百科全书前传 看图形与装修的关系

13、GPU大百科全书第一章:美女 方程与几何 14、重归正途迎未来 AMD新GPU构架深度解析
15、GPU大百科全书第二章:凝固生命的光栅化 16、GPU大百科全书第三章:像素处理那点事儿
17、GPU大百科全书番外篇:那年AN那些事儿 18、GPU大百科全书第四章:虚与实共舞的TMU
19、GPU大百科全书第五章 桌面显卡的捍卫者

20、经典为何消失无踪?千元显卡现状解析

21、可曾记得爱 看十年间名留史册的经典显卡

 

产品:GeForce GTX560Ti nVIDIA 显示芯片 回到顶部阅读

显存翻新历代记

  ● 显存翻新历代记

  显存的历史是如此的漫长悠久,它的命运一直是与显卡交织在一起的,甚至可以说显存的历史就是显卡的历史。当最初的显卡出现时,尽管功能单一且作用极其有限,但它毕竟担负着输出画面的职责,而输出画面这一连贯动作本身需要一个临时缓冲,因此从显卡诞生的第一天起,显存作为帧缓冲就已经出现了。今天我们看到的运行频率高达数G,带宽动辄几百G的显存系统,全部发端于缓冲这些每秒不过几K甚至仅仅几百字节画面数据的buffer。


GPU百科全书(6)谁也离不开的缓冲_第4张图片
古老的Trident 8900显卡

  受限于半导体工艺以及IC逻辑结构涉及的水平,最初的显存与内存具有极大的通用性,FP-DRAM(Fast Page DRAM)及EDO-RAM(Extend Data Output DRAM)等等当时内存常用的颗粒在显存中同样适用,甚至当时相当多显卡的显存颗粒都是可拆卸和手工扩展的。这些延迟几十甚至几百纳秒的显存在今天看来简陋不堪而且慢如蜗牛,但他们在当时不仅十分先进,而且其高通用性也促进和保障了显卡的正常工作以及稳定发展。

GPU百科全书(6)谁也离不开的缓冲_第5张图片
EDO-RAM

  随着时间的推移,显卡逐渐从传统的2D输出控制机构转变成了能够执行CPU发出的图形相关命令的独立单元,甚至具备了操作纹理及材质的能力。材质的以及帧缓存的配合操作对显卡的存储空间提出了前所未有的要求,传统的FP-DRAM以及EDO-RAM已经无法满足图形发展的需要。于是对SD-RAM的大规模使用,在显卡具备了“3D加速”功能之后便顺理成章了。与此同时,具备block-write(块写)能力,拥有更好读写性能的SG-RAM也开始崭露头角,但终因成本要素在未能流行起来。在SD-RAM时代,显存的延迟通常在8~10ns。

GPU百科全书(6)谁也离不开的缓冲_第6张图片
使用DDR显存的NV10

  GPU的出现将整个图形界推入了崭新的时代,更好的光影效果催生出了更大的材质需求,进而带动了显存的发展。NV10(Geforce256)不仅是人类历史上第一块GPU,同时也是第一块支持DDR-RAM显存的GPU。普通的DDR显存延迟一般为4~5ns,它将传统的SD-RAM显存的带宽提升了一倍。可以说NV10的出现,将整个图形界拉入了高速显存时代。另外值得注意的是,在DDR显存后期,SG-RAM的DDR版本GDDR开始崭露头角,这为今后的显存发展打下了良好的基础。

GPU百科全书(6)谁也离不开的缓冲_第7张图片
NV30+GDDRII=一个刻骨铭心的教训

  这世界上存在很多看上去毫无根据,但却又确实正确的现象,显存的更迭发展就是其中之一。自从伴随着NV30一起到来的失败的GDDR2显存之后,双数代显存性能及功耗表现差劲同时不受欢迎的魔咒就再也没有被打破过。尽管GDDR2和后来R600所采用的GDDR4都努力提升了带宽,但糟糕的功耗表现以及难以提升的频率不仅让第一代采用者大受其苦,也严重影响了自身的普及。GDDR2和GDDR4这两页历史不仅黯淡,而且很快速的就被人们翻过去了。

GPU百科全书(6)谁也离不开的缓冲_第8张图片
赌赢了GDDR5的HD4870

  与之相对应的,由NV36发端并在NV40上发扬光大的GDDR3,以及在RV770上让AMD一赌翻身并由此名留史册的GDDR5,则成了显存发展历史上光辉灿烂的一页。GDDR3的出现不仅最终让SG-RAM这一更加符合显存体系操作特点的存储颗粒彻底取代了SD-RAM,更让人类首次正式踏入了GHz频率的存储时代。从GDDR3开始,显存的运行频率和带宽开始大幅度地甩开系统内存。而GDDR5不仅以优异的性能让AMD转危为安,其极高的运行频率所带来的带宽也让显存第一次能够在真正意义上成为“寄存器溢出缓冲”,从而将整个缓冲体系联系在了一起。

GPU百科全书(6)谁也离不开的缓冲_第9张图片
GDDR4未能拯救R600

  从NV10开始算起,显存见证了GPU史上所有的创新和发展,NV10(DDR)、NV20(4 MC)、NV30(GDDR2)、NV36/40(GDDR3)、R600(GDDR4)、RV770(GDDR5),这些成功和失败的背后几乎都有显存及显存体系发展变化的影响。那么,显存究竟是如何影响到GPU乃至整个显卡的表现的呢?

产品:GeForce GTX560Ti nVIDIA 显示芯片 回到顶部阅读

好仓库不能没有管理员

  ● 好仓库不能没有管理员

  显存的发展就好像一个大仓库的改造工程。随着需求的增长,仓库的厂房越来越大(容量提升);不断增大的厂房让货物的进出口矛盾得以凸显,所以厂房进出口以及能够同时进出的货物也就跟着增加了(DDR-GDDR3-GDDR5);同时随着技术的进步,进出货的单位速度也越来越快(频率提升);这一切都让仓库的货物进出效率变得越来越高。但这一切都必须建立在一个基础之上,那就是仓库拥有称职的能够充分并合理的进行调度的管理员。这个管理员,就是显存控制器(memory controller)。


GPU百科全书(6)谁也离不开的缓冲_第10张图片
memory controller结构

  尽管显存的样式不断翻新,速度和带宽也越来越夸张,但显存体系的基本结构在本质上却与最初的原始形态以及作为本源的内存管理形态没有什么分别。显存的读写直接由显存控制器进行,它与内存部分的MC几乎完全一样。双方最大的区别,在于显存控制器的并联度要远远大于内存控制器。

GPU百科全书(6)谁也离不开的缓冲_第11张图片
LMA结构示意(图片来自网络)

  首次在显存控制器上引入大并行度概念的GPU是NV20,在NV20中NVIDIA采用了LMA(Lightspeed Memory Architecture )显存管理体系,不同于以往传统的单通道显存控制体系,LMA将4个32bit显存控制器以crossbar与所有显存进行直连,这让每一个显存控制器都具备了访问所有显存单元的能力,因此LMA获得了4通道并联128bit的显存管理效果。LMA的出现不仅在不改变单颗显存频率及位宽的基础上大幅提升了GPU的可用显存带宽,同时也为今天的显存管理体系创造了规则。时至今日,市售的所有显卡依旧采用多个64bit显存控制器并联的显存管理方式。

GPU百科全书(6)谁也离不开的缓冲_第12张图片
已具备现代MC雏形的R300显存控制体系

  显存的最初目的,甚至是目前为止最主要的目的,在于为GPU提供材质、采样操作及帧数据的缓冲场所。作为材质的最大需求者,TMU首当其冲的从显存中获得了好处。在前面章节中关于TMU的故事里我们已经知道,当程序载入并发出材质需求时,材质便被从程序在硬盘的材质库中被load到了显存里。以显存来充当TMU读写这些材质的快速缓冲,明显比让其直接从硬盘上直接读取要快速的多。材质在显存中拥有一组内存地址(Address),当TMU需要某个材质时,它只需要让TA单元(Texture Address)扫描显存,从中找出该材质对应的地址,便可以快速的完成后续的材质拾取动作。因此从操作手法上来说,显存在GPU缓冲体系中的地位与普通内存体系为CPU进行缓冲的机制是一样的。

GPU百科全书(6)谁也离不开的缓冲_第13张图片
512bit恐怖带宽的GT200结构(点击放大)

  内存体系拥有多级cache机制来提高存储系统的效率,与内存/CPU体系类似的显存/GPU体系有没有类似机制呢?有,答案依旧从材质中来,它就是Texture cache。

产品:GeForce GTX560Ti nVIDIA 显示芯片 回到顶部阅读

从无到有的Texture cache

  ● 从无到有的Texture cache

  和显存不同,由于显卡最初的工作并不涉及材质工作,所以纹理缓存的历史远没有显存来的悠久。甚至直到显卡开始具备材质处理能力时,由于要求相对较低,纹理缓存也没有在第一时间出现。


GPU百科全书(6)谁也离不开的缓冲_第14张图片
第一代出现“实体”Texture cache的产品——RIVA TNT

  纹理缓存在刚出现时并不受人重视,其处境甚至可以说有些凄凉。由于需求不大,最初的纹理缓存甚至连属于自己的实体都没有得到,人们只是显存中划分的一小块独立区域,这片区域通常被分配在显存前端方便读写,TMU将需要快速缓冲的材质数据有限存放在这一小片区域中。这个甚至只能称得上是buffer的小区域,就是最初的纹理缓存。

GPU百科全书(6)谁也离不开的缓冲_第15张图片
Generating Lightmaps特性

  随着需求的不断增加,图形需求带来的纹理尺寸增长是非常迅速的,与此同时,诸如mip-mapping以及Generating Lightmaps之类的复杂纹理和操作也被更多的使用在了图形效果的表达过程中。这些要求让TMU获得一套更加快速有效的缓冲系统的愿望变的迫切起来,于是,第一代“实体化”的纹理缓存便出现了。

GPU百科全书(6)谁也离不开的缓冲_第16张图片
RIVA TNT白皮书中明确了Texture cache的存在

  第一次透露出拥有独立纹理缓存信息的GPU是NV3,也就是我们所熟悉的RIVA TNT。遗憾的是由于公开信息的不足,我们已经无从得知出现在NV3中Texture cache的确切数量了,我们甚至不能确定他究竟是独立ram还是共享DRAM,这从侧面也反映出了当时对纹理缓存重视度的严重不足。其后NVIDIA曾经再次在NV15时代宣称其拥有独立于VRAM之外的纹理缓存,但具体信息依旧不明。到NV20时代,纹理缓存的存在渐渐被大众所接受和关注,但依旧同NV15一样确切数量无从考证,人们只能通过对NV2A的研究,将NV2X的Texture cache数量推定在了128K。其后的诸多GPU构架中都曾多次提到Texture cache,但对大小问题始终焉语不详。截止到NV40为止,整个GPU体系的纹理缓存一直处于半神秘状态,而且仅有一级,我们可以将其称为L1 Texture cache。

GPU百科全书(6)谁也离不开的缓冲_第17张图片
Texture cache对材质存储体系非常重要

  相对于L1,L2 Texture cache的出现则要高调的多。伴随着DirectX 9.0C的出现,Vertex Texture的出现对L2 Texture cache提出了实际的需求,在VertexShader单元外围布置L2 Texture cache成了显卡完整支持DirectX 9.0C的重要标志之一。NVIDIA在NV40中首次引入了L2 Texture cache,大小为128K,到G70时增加至288K。ATI则在R520中加入了完整的L2 Texture cache,并在R600中将其提升至256K。

GPU百科全书(6)谁也离不开的缓冲_第18张图片
引入L2 Texture cache的G70

  别看纹理缓存的作用表面跟CPU的多级cache相当,都是数据的临时告诉缓冲空间,甚至也分L1/L2两级,它最初的实际功能与操作方式却和原教旨的多级cache存在极大的区别,甚至可以说完全不同的。可以说最初的纹理缓存,只能用一片混乱来形容。

产品:GeForce GTX560Ti nVIDIA 显示芯片 回到顶部阅读

最初的杂乱无章和第一次统一

  ● 最初的杂乱无章和第一次统一

  CPU的多级cache体系,或者说原教旨意义上的cache体系的最大特点,在于通过预测以及多级高速大带宽sram对较慢的系统主存进行预取,从一般意义上来讲,L1的命中率一定会比作为扩展出现的L2更高。无论包含式cache还是排斥式,CPU的cache系统都是面向整个核心开放且功能是统一的。纹理缓冲与之最大的不同,在于L1可以被视作只为整个TMU单元提供服务,而L2则既要为充当L1的扩展缓冲,又要为Vertex Texture Fetch拾取并进行顶点纹理相关操作提供帮助。


GPU百科全书(6)谁也离不开的缓冲_第19张图片
Vertex Texture操作效果

  在最初的DirectX 9.0C出现的时候,Vertex shader单元具备在TMU单元进行材质操作之前即通过Vertex Texture和Vertex Lighting按照程序要求提前访问材质库的能力,这样做可以为整个模型附上最基本的带光照信息的底层纹理,方便对Vertex shader单元对几何外形进行调节。但这一步骤的调整使得TMU之外出现了第二个需要缓冲材质的单元,因此为其开辟第二组临时缓冲区域以及由此带来的凌乱的缓冲区域及功能划分,就成了DirectX 9.0C不得不背负的负担。

GPU百科全书(6)谁也离不开的缓冲_第20张图片
Vertex Texture特效

  实际上不仅仅是DirectX 9.0C的问题,纵观GPU乃至整个显示核心的发展史,缓冲区域及功能杂乱无章以及各自为政始终是图形处理器最大的“特色”。因为最初的功能分化,几乎每一种硬件管线功能都要求对应且独立的buffer,而buffer渐渐地就演变成了cache。除了我们在这里面对的Texture cache之外,ATI研发的几乎所有GPU构架都具有回写缓冲,ROP里也有Z-cache和Stencil-cache,甚至还有各种shader cache,就连output buffer曾经也可以被看做是一种cache……各自为战不仅让设计难度随着单元和功能需求的增多而不断放大,更让希望使用更好硬件资源的程序员们苦不堪言。

GPU百科全书(6)谁也离不开的缓冲_第21张图片
AMD GPU的每一个角落都能看到"cache“

  随着DirectX 10的出现,Vertex Shader和Pixel Shader单元通过ALU的形式被统一成了Unified Shader。传统的Vertex Texture Fetch的功能被全新的统一单元所替代并实现,这让两组先前纹理缓冲作用不一服务单元不同的情况得到了好转。因为不再需要对不同单元负责,现在L2 Texture cache终于可以作为L1 Texture cache的扩展缓冲而安心工作了。

GPU百科全书(6)谁也离不开的缓冲_第22张图片
DirectX 10帮了倒忙

  哦?这么说DirectX 10不仅统一了shader,更功德无量的统一了缓冲体系,让缓冲体系杂乱无章的局面得到改善喽?不……DirectX 10的出现虽然确实让Texture cache体系获得了统一,但它却引入了另一个以前从来没出现过的缓冲——shared memory,简称shared。

产品:GeForce GTX560Ti nVIDIA 显示芯片 回到顶部阅读

shared:统一带来的阵痛

  ● shared:统一带来的阵痛

  我们前面曾经提到过,草稿纸其实也是一种缓冲。既然说到了草稿纸,你还记得小学时做一道应用题需要多少草稿纸么?我估计一张A4纸大小的草稿纸就足够一个哪怕是拥有毕加索一般的天赋,能够边算边涂鸦的小学生完成一次数学期末考试了。那你还记得大学以后做一道题需要多少草稿纸么?我记得研一那年某次做数学物理方程的作业,一道题就让我用掉了9页A4纸,而那次作业有9道题,害得我不得不跑去实验室偷了半包打印纸回来……


GPU百科全书(6)谁也离不开的缓冲_第23张图片
毕业5年后仍然让笔者看得心惊肉跳的弦振动方程

  这现象说明了一个并不复杂的问题——随着运算量、运算难度以及运算通用度的增加,运算单元所需要的缓存量也是会大幅增长的。

  伴随着DirectX 10对shader单元的统一,ALU成了整个GPU的核心部分。过去VS和PS单元会分别处理矢量和标量数据,而shader统一之后,同一个ALU必须同时面对向量和标量数据。再加上直接向程序员开放ALU带来的通用计算需求,伴随着由此带来的执行环境以及编程环境的改变,ALU所要面对的运算种类和通用性都有了很大的改变,其作为常规的通用运算资源所需要的缓冲量也便跟着大幅增加了。

GPU百科全书(6)谁也离不开的缓冲_第24张图片
ALU的独挑大梁让缓冲体系不得不进行调整

  为了应付全新的缓冲需求,同时也为程序能够更高效率的得到执行,微软在DirectX 10中第一次引入了shared的概念。shared是一组面向ALU开放的延迟完全透明的只读cache,ALU可以将需要的数据临时寄存在这里。shared只读不可写,因此并不能与延迟不透明的unified cache相提并论,但对于线程、图形指令和大多数需要几何关联的传统通用计算指令来说,shared已经可以满足要求了。

GPU百科全书(6)谁也离不开的缓冲_第25张图片
常规shared memory特性

  相比于显存和纹理缓存,shared的年纪要小很多很多,它也是缓冲体系中最后出现的一位。第一个引入硬件shared的构架是NVIDIA的G80,G80为每一个SM中的8个SP(ALU)单元配备了16K的shared memory,每个SP均可以访问全部的shared bank,这种富足的资源设计一直维持到GT200为止。AMD在R600中也引入了名为GDS(Golbal Data Share)的shared机制,以便满足对DirectX 10的基本支持,由于GDS本身的不完善,AMD又在此后的RV770中再次引入了LDS(Local Data Share)这一2级shared作为GDS的补充,并最终在RV870中完善了LDS的功能,使其可以发挥出应有的性能。

GPU百科全书(6)谁也离不开的缓冲_第26张图片
加入多级shared的RV870存储图示

  shared的出现为ALU提供了较好的临时缓冲空间,客观上提升了处理shader及通用计算指令的效率,但这种做法让好不容易看到了统一希望的缓冲体系再度凭添了新的混乱因素。NVIDIA的构架因为shared的引入而变成了shared memory和L1/L2 Texture cache分离并各事其主的状态,实际上与统一Texture cache之前并没有本质区别。而承袭ATI专缓专用衣钵的AMD则更是创造了GDS+LDS+shader constant cache+shader instruction cache+memory R/W cache+L1/L2 Texture cache+Z cache+Stencil cache+color cache+……好吧,我不知道该怎么形容了……的混乱状态。尽管这其中有不少工作实际上是使用register来进行的,但最低限度下2级shared的出现确实在事实上影响了程序员对硬件的使用以及AMD对自身硬件的控制……

GPU百科全书(6)谁也离不开的缓冲_第27张图片
你能数清楚这里有多少个cache么……

  可怜的程序员们以及更加可怜的用户们,难道就只能接受这么乱下去的现状了么?

产品:GeForce GTX560Ti nVIDIA 显示芯片 回到顶部阅读

只有统一的路才对大家的胃口

  ● 只有统一的路才对大家的胃口

  首先意识到并开始尝试解决问题的是NVIDIA。在Tesla构架之后,NVIDIA为我们带来了支持DirectX 11的Fermi构架。Fermi构架在缓冲方面最显著的特色,在于引入了统一的unified cache。

  Fermi构架采用大并行度的GPC分块设计,每个GPC内部分为4组SM单元,每个SM单元拥有完整支持读写操作的L1 cache体系。该L1 cache体系可以在16K shared memory/48K L1 cache以及48K shared memory/16K L1 cache之间进行切换,不仅能够满足DirectX 11要求的32K shared的最低限度,更为传统的DirectX 10以及特种程序的需要提供了支持。而在整个GPC结构的外围,NVIDIA配置了768K的L2 cache,不仅能够充当L1的扩展,将其与显存联系起来,更可以同时为TMU提供Texture cache服务。除此之外,新的cache体系还可以直接充当几乎所有寄存器的溢出缓冲。


GPU百科全书(6)谁也离不开的缓冲_第28张图片
Fermi构架存储体系

  Fermi中unified cache的引入,为人们展示了一种很好的解决缓冲资源各自为战现状的途径。与CPU一脉相承的统一多级cache让大多数单元从同一个缓冲体系中获益,ALU也好TMU也罢,想要缓冲的时候直接访问同一个cache就行了。这种做法等效的同时提升了大多数单元的可用缓冲资源水平,减少了register溢出导致的灾难性后果,最终提高了整个体系中各单元的单位周期复用率。

GPU百科全书(6)谁也离不开的缓冲_第29张图片
unified cache是Fermi构架的重大革新

  当然,这世界上没有一蹴而就的完美,现阶段Fermi cache体系也存在着美中不足。为了照顾传统的shared应用,Fermi的L1体系并未完全unified化,这不仅给驱动控制添加了难度,也为cache命中算法的开发制造了不小麻烦。尽管如此,引入unified cache依旧让我们看到了巨大的好处和美好的未来。有介于此,NVIDIA决定在下一代的Kepler构架中继续强化cache也就变得顺理成章了。

GPU百科全书(6)谁也离不开的缓冲_第30张图片
Fermi的L1体系为照顾shared而没有完全unified化

  在unified cache的引入中,受益最大的可以说是寄存器。接下来我们就来看看缓存体系的最后也是最快的一部分,究竟是怎样为GPU运行提供帮助并从unified cache中获益的吧。

产品:GeForce GTX560Ti nVIDIA 显示芯片 回到顶部阅读

欲求不满的寄存器

  ● 欲求不满的寄存器

  寄存器同显存和cache一样,都是发源于CPU的重要缓冲组成部分。长期以来,寄存器都伴随在运算单元旁边,以最及时的延迟和最大的带宽为运算单元提供着指令寄存空间(IR)、程序计数缓冲(PC)以及累加器(ACC)等多方面的服务。


GPU百科全书(6)谁也离不开的缓冲_第31张图片
常规6bit指令寄存器结构

  寄存器可以为运算器提供最快速的临近临时存储,让它们释放结果、挂起数据或者弯成回溯之类的事情。几乎每一个运算单元的每一次动作到有寄存器参与的身影。由于通常拥有最高的运行速度以及0t的延迟,GPU常用的32bit寄存器相当耗费晶体管资源,这让它们的身价更加倍增。由于无法随心所欲的配置大量寄存器,每一个运算单元能够分配到的寄存器资源都非常的少。以G80为例,每个SM包含8个SP单元,而寄存器总量仅为32K,每个ALU仅能分到4K 32bit寄存器资源。而R600极其系列衍生构架则更是少到了平均3.3K/ALU的水平,直到Cayman构架才补足到了4K。

GPU百科全书(6)谁也离不开的缓冲_第32张图片
NVIDIA GPU的寄存器资源自G80以来一直相对充足

  对于ALU来说,条件允许的前提下对寄存器的需求近乎是无限的,这种需索无度与寄存器相对稀少的现实总量形成了鲜明的对比。我们在GPU大百科番外篇对NV3X构架的分析中可以看出,寄存器无节制溢出的后果是可怕的,因此程序员们除了小心谨慎的处理自己手头的程序需求,尽量让ALU在现有资源总量允许的前提下对寄存器进行使用之外,就只有祈祷硬件准备了充分的寄存器溢出缓冲以备不时之需了。

GPU百科全书(6)谁也离不开的缓冲_第33张图片
因为寄存器问题大败的NV30构架

  cache是很好的寄存器缓冲溢出,虽然它的速度和延迟相对于寄存器来说差了不少,但依旧可以在编程环境处理得当的前提下发挥很好的延迟掩盖作用。而unified cache在GPU中出现之前,GPU中大大小小的各种“cache”并不能通用,因此也就不能随心所欲的发挥应有的作用了。cache之外,接下来可供选择的途径就只剩显存一途了,显存的空间对于ALU来说虽然可以大到近乎无限,但显存的低带宽和高延迟让其在相当长的一段时间内都不具备参与核心缓冲的能力。最早使用显存来充当寄存器溢出缓冲的NV30带来了几乎是灾难性的表现,直到与MC配合之后带宽突破100G甚至接近200G的GDDR5出现之后,显存才具备了充当寄存器溢出缓冲的条件。而此时Fermi中unified cache的引入,也适时的将寄存器和显存这对速度差异仍旧巨大的缓冲连接在了一起。

GPU百科全书(6)谁也离不开的缓冲_第34张图片
Fermi的cache体系已经彻底将寄存器和显存联系在了一起

  同GPU的很多单元一样,存储体系终于也在各自为战甚至陷入混沌相当长一段时间之后,再度呈现了统一的趋势。

产品:GeForce GTX560Ti nVIDIA 显示芯片 回到顶部阅读

我们都是GPU的一部分

  ● 我们都是GPU的一部分

  相信通读过到GPU大百科全书的朋友们一定都会有这样的感受——每一个GPU中的单元以及工作环节,似乎都与人们的日常生活有着千丝万缕的联系,都可以在我们周围找到些影子。是的,我们在所有文章中一直着力展现的,其实并不仅仅是GPU内部单元的名字代号工作原理之类的说明书式内容。GPU作为工具,其上所附庸的创造者的痕迹以及由此展现出来的普适的道理才是我们要表达的重点。


GPU百科全书(6)谁也离不开的缓冲_第35张图片
GPU的价值

  经过本篇GPU大百科的介绍,屏幕前的你现在重新审视存储体系,是否会有新的发现呢?

  举些例子吧:显存在缓存体系中虽然最慢同时设计最简单,但它却以自身的廉价和庞大为GPU最大的缓冲需求——材质提供了令人满意的缓冲解决方案。这不仅让这个最简单部分一跃成为最直接影响GPU以及整块显卡最终性能的重要因素,甚至让它成了GPU设计竞争中弱者保身甚至翻盘的重要途径。这说明廉价未必就是弱势,能够满足最大需求才应该是衡量价值的关键性要素。

GPU百科全书(6)谁也离不开的缓冲_第36张图片
三星GDDR5高速显存颗粒

  缓冲体系并不直接参与运算和控制过程,但它却因为自己能够提供的寄放空间而具备了帮助整个GPU掩盖动作延迟的能力,这让它成了GPU不可或缺的组成部分。如果没有缓冲体系,GPU内部的运作延迟不仅无法得到掩盖,更会以逐级放大的形式最终对画面的表现形成灾难性的影响,任你有再多再强劲的运算单元也是无济于事的。这正如我们的生活一样,不管你的能力多大,精力多么过人,没有合理的安排、适当的缓冲以及休息调整,工作一样无法有效的进行下去,甚至最后还可能会赔上身体。

GPU百科全书(6)谁也离不开的缓冲_第37张图片
慢下来,品一壶香茗,别被工作绑得太紧了

  我们说过,剑本凡铁,因锻打而生灵性,因持者执念而分善恶。别看GPU仅仅是一个帮助我们显示图像的工具,创造者们身上的诸多特质乃至整个人类社会的很多本质在它们身上都能找到浓缩和阐释。只要静下心来加以沉淀,各中滋味相信屏幕前的你一定能够品味出来。

GPU百科全书(6)谁也离不开的缓冲_第38张图片
GPU中蕴藏的道理还需诸位自己体会

  随着缓冲体系故事的结束,我们GPU大百科全书关于GPU部件部分的介绍就全部完成了。回顾这艰苦又充实的四个月,我们不得不再次由衷地感谢屏幕前的诸位——没有你们的阅读就没有我们的坚持,更不可能有这长达10万字的漫长连载。在诸位那令我们感动到甚至有些惶恐的期许中,GPU大百科全书终于要迎来终章了。在下一期的GPU大百科全书中,我们将全面回顾GPU的诸多特性,为大家展现一些GPU最本质的特色之处以及一款优秀GPU所应该具备的特质。还是那句话——敬请期待吧。

你可能感兴趣的:(Render)