RV870和GT300的一些猜测
个人觉得SM4.0硬件规范和DX10都是过渡产品,现在SM5.0和DX11横空出世,相信大家都期待很久了。DX11在去年年末的DX SDK中就已经存在,只是没有DOCUMENT,而DX12相信也在开发之中了。ATI目前有售的民用产品应该是RV770,而在09年第三季度要发售的是支持DX11的RV870;再看看现在深陷泥潭的NV,目前有售的是GT200,支持DX11的GT300还不知道具体什么时候出来L推测应该是09年第4季度。相信最精彩的战争将在2010年上半年出现,AMD全新架构的RV970、GT300和INTEL的怪物LARREBEE将悉数登场。本文中所有GPU架构都是在RV770和GT200的基础上对RV870和GT300进行猜测,然后结合DX11进行讲解,所以不能保证内容都是正确的,仅供参考:)。
RV870:R600最后的武士
R770和RV870其实都是R600架构,在AMD收购ATI之后,将自家CPU上先进的芯片内部总线传输技术嫁接到了GPU上,使之较ATI之前的GPU在性能上有极大提高,架构一直沿用至今也没有出现太大的技术瓶颈。RV870只在频率、流处理器数量、纹理光栅单元等参数上有量的提高,要等到RV970才会使用全新架构。RV870纹理单元和光栅化单元也分别由RV770的10个和4个增加到12个和8个(此为猜测)。AMD声称RV770拥有800个流处理器,但他指的是算术逻辑计算单元,有意义的数据应该是160个,RV870的流式处理器更是多达1200个,不过我们要把他除上5才得到一个比较有意义的数字,那就是240个,根据其纹理单元可能为12个的猜测,RV870就会将20个完整的流处理器编为一组,共12组,每组对应一个纹理单元,相比RV770确实增加了不少。
RV770内部使用了两层组织设计,第一层是内部的10个簇,它们用cross bus也就是AMD CPU中使用的switch hud将这些簇联接起来,每个簇包含16个core,一个纹理单元(包含1个顶点地址生成器,1个顶点攫取器,4个纹素插值过滤器,16个纹理采样器,4个纹理地址生成器),一个16KB的share memory(用来在core之间高速共享数据R/W),一个L1 Texture Cache(大小不太清楚);每个core中又包含1个分支指令执行单元,5个超标量计算单元,其中一个还可以执行超越函数。在来看看GT200,他第一层架构是10个所谓的TPC,每个TPC包含3个SM,每个SM又包含8个SP,一个双精度浮点计算单元和2个和两个超越函数执行单元,每个SP包含一个分支指令计算器,一个整数单精度浮点数ALU和MAD计算单元,真TM麻烦。最重要的就是ATI所谓的超标量计算架构和NV的纯标量计算架构的差别。先说GT200的纯标量架构吧,GT200的SM有两个指令ISSUE PORT,一个到分支计算器ALUMAD计算器和DPU,一个到FMUL SFU单元,一个次ISSUE最多可以抓取2条指令(必须满足要求),送到最多8个SP中,共16条,GT200将矢量计算都分成了标量计算,比如float4的乘法,分成了4个float乘法指令,显然使指令数量增加了不少,为了达到比较好的并行性,NV不得不增加SP的数量。而RV770使用了所谓的VLIW,就是宽指令集,每个SP拥有5个计算单元,这5个计算单元可以任意组合使用,比如float2 f0 = f1 * f2; float3 f3 = f4 * f5;这两条指令可以合并成一条宽度为5的SIMD指令,只需要一个ISSUE周期和一个计算周期就能完成5个FLOAT的计算,这样看来ATI的优势还不小,首先指令变少了,单就ALU和MAD计算单元来讲也远多于GT200,应该性能远高于GT200才对,但实际情况并非如此,最主要的原因有如下两条:1、目前ATI驱动中的SHADER编译器还不具备乱序分析,指令分拆重组功能,在不能完美组成5D矢量计算时,SHADER利用率不高,比如2个float3的乘法,就不能进行合并,只能分两次ISSUE计算,这样在这2次计算中,Shader利用率只有60%,还有2个单元空闲着。而GT200 SP的利用率应该长期保证在100%。2、shader运行的频率完全不同,比如市面上流行的GT200核心的GPU GTX280核心频率一般为620MHZ左右,而SHADER频率一般为1300MHZ,反观采用RV770核心的GPU HD4870 核心频率和shader频率都在750MHZ左右。这样我们可以粗略计算一下RV770和GT200的浮点计算能力: GT200: 1.3*240*2(MAD算2次浮点计算) = 624GFLOPS(在这里我们没有算上NV SM中的2个SFU和一个DPU,因为他们计算太有局限性),RV770: 0.75*800*2 = 1200GFLOPS,轻松过T。NV的另外一个超级烂的概念就是WARP,本来应该是一个纯软的CUDA编程概念,没想还跟实际硬件架构有关,GT200的WARP是32个线程,其实GPU硬件层是没有线程概念的,只有指令,所谓32WARP无非就是32条指令,明明只有8个SP为什么一次却能同时执行32条指令,我也不太清楚,大概GPU的各种指令的平均延迟大概为4个周期,可以重复利用空闲等待硬件,或者利用较高的核心频率来达到这个目的,我比较确定是前者,因为我没有看见SP中有LOAD和STORE执行单元,应该是作为SP的一部分。RV870的核心频率估计高达950MHZ,比RV770核心高出约25%左右,依然使用内外同频设计。
GT300采用40nm技术,原定由台积电代工制造,晶体管数目高达24亿,512个流处理器,比GT200的240个多了272个,依然采用TPC架构,共16组TPC,每组32个流处理器,但每个TPC内部的纹理单元数与GT200一样为8个,封装面积495mm2,采用异步频率,具体比例不好说。按照NVIDIA的惯例,第一块采用GT300核心的GPU代号应该是GF GTX380,总的来说在体系架构上跟GT200基本相同,最大的进步就是制程升级成了40nm,流处理器数目提高,外围增加了支持DX11的一些功能。然后就是GT200的双ISSUE PORT在极端情况下可以做到每2周期执行一个操作,不过这个对指令类型的搭配要求比较高,相信在GT300中会保留或增强这个特性。
DX11通过computer shader提供类似CUDA和BROOK通用并行编程的特性,这可能让NV和ATI比较不爽。因为并行编程其实就是一段代码同时在诸多数据上进行运算,然后同时将结果输出到目标的过程,CUDA BROOK还有DX11的CS都将这一过程软件抽象为线程,在CS中,将要在数据上执行的代码称为线程,以三维矩阵的形式将这些线程组织成ThreadGroup,Thread Group还可以被进一步组织成Thread Grid,每个Thread Group中的所有线程拥有一个share memory,在DX11中的规格为32KB,我们知道在GT200和RV770中,这个SHARE MEMORY在硬件只有16KB,GT200中这个share memory位于SM(多重流处理器)中,被SM中的8个SP(流处理器)共享,RV770中则位于PC(流式处理器集簇)中,为16个5路超标量shader processor共享,可见GT300和RV870的share memory应该增长为32KB,当线程需要读取的数据正被其他线程修改时,需要进行存储访问同步,可能采用的是MOSI协议(Modified Owned Shared Invalid),跟CPU中普遍采用的MESI有些许不同,后面会详细阐述。其实GT200和RV770在硬件上已经支持CS,根据硬件规范RV770每个Thread Group中最多只能有768个线程,而GT200是1024个。