|
前面我们已经提到,存储器的延迟绑住了GPU的手脚,而越来越非线性化的shader更让单纯依靠增加平行管线提升性能的GPU举步维艰,那么GPU要如何来避开这两个障碍呢?答案就是多执行诸体系(Multi-Threading Computing Pipeline),多执行绪是提高各个核心或流水线的执行效率,隐藏内存存取的延迟的有效途径。实际上,第一个基于多执行诸体系的GPU并非G80。早在NV40和R400(R520的前身,与我们熟悉的R420是完全不同的体系)上,为了掩盖存储器延迟,提高Shader执行效率,ATi和NV就已经引入了比较完善的Multi-Threading架构。让我们来看一看Multi-Threading架构到底是如何工作的。小熊在线www.beareyes.com.cn
多执行诸架构

由于GPU本身的工作环境就很容易平行化,所以对GPU而言引入Multi-Threading其实要比CPU简单。在支持Multi-Threading的GPU工作的时候,线程管理调度器会对所有刚进入流水线的shader做如下分配:1.计算能同时存在多少个Thread。这个数量一般是总的寄存器资源除以每个thread的寄存器数量然后向下取整;2.将可用的任务分配到所有的thread上;3.每个Thread包在执行的时候,标记它的stall(停顿,一个典型的停顿是一段包含Texture Fetch指令的shader,因为Texture Fetch指令要把纹理数据从显存种读到流水线里来,是非常长的一个pass), 如果有stall,线程管理调度器就在读取纹理数据的时间段内先暂停这个Thread,然后切换到另一个thread包(warp or bank)送给ALU,让其它指令以Thread的方式持续执行,不会为了存储器延迟而将整个Shader停止。如果分辨率是1600x1200 Pixel的话,就相当于有这么多的task得做。每个Pixel本身都是独立的,所以可以做成彼此不依存的平行化(实际上受成本的影响不可能做这么细,现在的GPU一般是将数个Pixel合在一起称为一个Block,每个Block作为一个分支来执行)。小熊在线www.beareyes.com.cn
G8X架构的将Shader转化为平行线程的处理流程

相比之下,CPU通常只需要执行一个、顶多两个的task,主要需要进行的工作通常只有一个。所以CPU通常希望某个Thread的指令1执行之后,马上可以在之后执行指令2。也就是说,CPU执行的软件thread平行度很低,需要执行的Thread数量不大,所以希望单一个Thread可以尽量不停顿地不停执行,而演变成可以快速地执行一个Thread的结构;而GPU执行的软件则因为Thread平行度很高,就变成了某个Thread要是停顿就立刻换到其它Thread执行的结构。需要执行的Thread数量很大-所以不停地在执行绪间切换。所以对GPU而言,采用多执行绪是很自然的事情。小熊在线www.beareyes.com.cn
Multi-Threading掩盖存储器延迟的实例

实际上,Multi-threading的本质思想与增加管线是一致的,那就是提高GPU的并行性,让GPU在同一个周期里能够执行更多的指令。只不过单纯增加渲染管线提高的是执行单元本身的并行性,而Multi-threading提高的是线程级并行性,后者更为灵活实用。小熊在线www.beareyes.com.cn
作为最新一代GPU,G8X最大的特点之一就是摒弃了已往单纯通过增加平行管线数量来提高整体平行度的做法,而是通过提高线程级并行性,改善平行管线本身的平行度来提高效率,提高总体平行度。小熊在线www.beareyes.com.cn
2007年04月18日 于上海
版权作品 未经许可 请勿转载
|