| |
真实重新定义,NVIDIA GeForce8800系列显卡Reality Redefined,NVIDIA Geforce8800 Series![]() 2006-11-09 16:41:38
出处: 本站 人气值: 作者: EXP Studio ![]() ![]() 流水线管理体系——Gigathread 除了在底层执行单元效率上的彻底革新外,G80图形核心还为整个流水线引入了一道更加严格科学且富有效率的管理体系——Gigathread技术。实际上,G80图形核心整个架构动力的源泉就来自于此。 □-改善流水线效率
Gigathread带来的另一个好处就是,能够减缓SIMD流水线中指令间的依存。在之前的G7X或R5XX架构中,由于SIMD流水线本身指令发射数有限,而它们能保有的threading数目又受到限制,流水线中的Alu算术指令和Tex纹理指令必须按照一定的比例配对,才能发挥出全部的运算能力。而G80上,由于Gigathread能硬件的将各个thread的stage(如Register file与各种控制的现况)保存下来,所以整个流水线对非规则指令的“忍耐”能力大大提高,即使是未经过优化排序的指令,也能被高效方便的执行。
由于DX10将所有的Pixel和Vertex视做同等的Shader操作,因此这个管理器也负责进行高效的VS or PS的鉴别。它同时还会判定当前需要渲染场景的具体Vertex以及Pixel Shader的计算需求量,根据这个数据动态的调整所有通用着色单元中PS和VS的比例。 □-对抗数据延迟 Gigathread除了负责整个流水线的动态管理外,还担负着另一项重要使命,那就是对抗延迟。对于当今频率越来越高的GPU而言,如何对抗外部存储器延迟成为了一个关系到最终性能发挥的重要课题。一个以500MHz时钟频率运行的GPU,它的单个GPU时钟周期的长度在2ns以下。而我们可怜的外部存储器(显存),还在以200MHZ左右的速度工作。这就意味着,如果碰到一个Texture Fetch(纹理拾取指令,它需要GPU去读取显存里某个部位的数据),GPU从开始存取外部DRAM,到DRAM的第一个数据包实际送出之间,大概有十几到几十个ns的时间差,换算成GPU内部的时钟,就是几十乃至数百个周期的数据等待延迟,这种延迟会让整个流水线都陷入停顿,对于高速运行的GPU来说无疑是灾难性的。
在G80图形核心上,一旦Thread Control Unit发现某一个Shader Unit因为Texture Cachemiss(纹理缓存命中失败)而必须进入显存去寻找需要的纹理数据(Texture Fetch),它便会立刻将这个Shader Unit当前正在执行的Threading的各种控制现况冻结并保存在Register file(临时寄存器)里,然后立刻将另外的新Threading提交给这个Shader Unit执行,直到Texture Fetch完成为止,从而保证了整个流水线的效率不受DRAM延迟的影响。可以说,是Gigathread保证了整个流水线的运行效率,使它们得以免受延迟等因素的困扰。 □-维持SIMD正常运转 在之前的GPU架构中,除了运算能力之外,GPU本身对3D渲染流程的进行还有很多限制。比如,面对阴影作边缘柔和取样的时候,通过合理的使用if / else指令可以让Shader在不需要取样的像素直接跳过,节省出大量的Pixel shader资源,这就是动态分支(Flow Control)。 对于大多数DX9规格的GPU而言,如何保持SIMD流水线的平行度是个很令人头痛的问题。因为SIMD流水线单指令,多数据流的特点,位于同一个Quad内的4条Pixel Shader着色管线都共享同一套指令分配体系,并处于同一个控制电路的控制之下。所以,在执行动态分支的时候,这个Quad内的4条Pixel Shader着色管线在每个时钟周期只有跑同一种指令,才能让所有ALU都保持工作。如果遇到不同的指令介入,那么因为指令发射器和控制单元共享的问题,实际无法在单周期完成。
那么,对于要尽量维持并行能力的SIMD体系来说,这种状况就毫无意义了。G80图形核心的Gigathread架构能够为流水线维持尽量多的平行线程,从而能将进行分支时的Batch Size(可以理解为分支工作的区域)做得很小(G80图形核心最小能够做到对单个连续的4*4象素块进行分支处理而保持峰值性能)。这样就能尽量减少在一个象素块里遇到两条不同指令的可能性, 从而避免SIMD流水线的并行度被破坏。 |
