|
发表于 2009-2-20 00:22:05
|
显示全部楼层
我是熊板斧的学生,呵呵
我知道老师他每天11点左右就要睡了,所以现在12点多了,他不可能回答问题的。这里有一些我从他那里学来的东西,你可以看看,这些我基本上已经理解了。我把N卡在通用计算,特别是高密度科学运算中领先的原因总结成3点,这其中大多数都是老师的原话:
TLP(线程并行度)考验线程能力和并性能力,ILP(指令并行度)则考验指令处理。TLP要求强大的仲裁机制,丰富的共享cache和寄存器资源以及充足的发射端,这些都是极占晶体管的东西。
R600以及改进的RV770做不到这些,ATI现在的典型设计思路是ILP。RV770改进于R600,虽然有所改善但还是ILP的结构,运算能力强大,运算密度低下。只不过周边资源放大之后RV770可以比R600更好的通过cache机制来掩盖延迟造成的损失而已。
周边资源方面:
G80的每tpc配备16k的shared memmory,256k的纹理缓冲和64k的指令缓冲。有说法是shared memmory直接使用寄存器而非cache,未证实。GT200是每8个sp使用16k的shared memory。
R600每5个US配备8K的LDS,512K的纹理缓存和16K的指令缓存。R600每5个US配备8K的LDS,512K的纹理缓存和16K的指令缓存,RV770将LDS和指令缓存都放打了1倍,可以更好的在周期上掩盖延迟带来的损失。
LDS(Local Data Share)作用等同于NV这边的shared memory,就是个每个SM内部的所有运算单元共享数据和临时挂起线程的。
简单比较后你就可以发现NV的周边资源比ATI要丰富地多。由于周边资源的充沛,G80 G92 GT200可以通过控制SMIT活用跳转来在实现线程在不同的sm之间进行跳跃,这实现了宏观上的乱序执行。
再谈通用计算方面两种架构具体的运算过程:
R600为每个US配备了1个发射端,所以如果要保证指令吞吐不受限制就通过VLIW,也就是超长指令打包的形式将若干个短指令打包在一起。理论上可以做到1个4D+4个1D打成一个包一起丢进US,这样可以最大限度的避免发射端不足的问题,可是如果很不幸,这个包里面有一个1D指令的结果很不凑巧是同一个包里另外一个1D指令的初始条件,效率就非常低下了。
同样的2个关联1D,R600需要打包—在所有寄存器中转一圈—运算第一个1D同事第2个1D等着—从寄存器出来,解包—把第一个1D的结果和第二个等待的1D都释放进LDS,等待再次打包—打包完成—进入US计算。
而G80只需要让第2个1D直接在shared memmory等待,第一个1d进入某个SP—运算,出来之后直接让第二个1d开算,这样提高了效率。
第三点是运算线程的颗粒度问题:
线程不是单独存在的,在流入SM之前都要打成包,这样可以在现有资源能够承受的情况下尽可能大的提高吞吐。
ATI那边叫frontwave,每个frontwave包含64个线程。
NV这边叫WARP,每个WARP包含32个线程。
ATI那边是每够64个线程,仲裁器就会动作一次,把一个frontwave发送给空闲的一个VLIW CORE。
NV这边比较特殊,存在HALF WARP,也就是说每16个线程就可以发送给SM一次。
所以无论是发送频率还是发送延迟,NV都领先ATI数个数量级。
G80的最小线程执行粒度就是他的warp的大小,每个warp允许32线程,每个warp还可以拆分成2个half warp,后藤老爹说这两个half warp之间甚至可以OOOe……而RV770的最小线程粒度则是他的wavefront,每个wavefront64个线程而且不可拆分。
粒度越细,能够调用并行度来进行指令延迟掩盖的机会就越大。在指令的最小相应延迟方面,G80领先R600的幅度达到了2个数量级,就是因为R600抱着ILP不放,结果粒度太大……
[ 本帖最后由 cicikml 于 2009-2-20 00:25 编辑 ] |
评分
-
查看全部评分
|