流结构和技术趋势(摘译) 

2006-12-08 19:44 发布

1548 0 0
 

第29章 流体系结构和技术趋势
现代的技术允许今天的处理器设计者把巨量的计算资源整合到他们最新的芯片中。对于
这些设计师来说,如何把处理器容量的增长转化为性能的增长,这就是他们面临的挑战
。最近十年的图形处理器开发显示了GPU设计者们在这一任务上的巨大成功。本章,我
们要分析GPU构建历程的技术趋势和架构趋势,同时展望我们未来所期望的。

29.1技术趋势

29.2高性能计算的关键

29.3流计算
在前面的各节中,我们看到,现在建立高性能处理器不但需要高效率计算,同时需要高
效率通讯。CPU很难适合那些高性能应用计算的一部分原因就是它的线性编程模型,这
种模型使得程序不符合并行模式和通讯模式。在这一节,我们要描述流编程模型,它能
使程序按一定的方式结构化,从而使得许程序可以执行高性能计算和高性能通讯。这种
模型就是今天GPU编程的基础。

29.3.1流编程模型
在流编程模型中,所有的数据被表达成流。流就是我们事先定义好的一组有序数据集合
,流里面的数据要有相同的类型。流里面数据的类型既可以是简单的(一组整数或者一
组浮点数),也可以是复杂的(一组顶点,或者三角形,或者转换矩阵)。虽然流可以
是任意长度的,但是我们会看到,当流很长(几百个或者更多的数据在流中)的时候,
在流上面的数据操作会更加高效。在流上面允许的操作包括:从中拷贝,从中派生子流
,用独立的索引流来索引其中的数据,在流上面的数据执行kernel计算。(译者注:一
个kernel就是一次核心计算,比如我们对流中的每个顶点都进行一个坐标系变换)。

在所有的流上面进行kernel操作:以一个或多个流作为输入,产生一个或多个流作为输
出。kernel的特征被定义为,它在整个流上面的数据进行操作--相对于仅仅在独立的
某个数据上操作。最典型的kernel就是在流上面的每个元素进行一个函数映射:比如一
个转换kernel可以把流里面的每个顶点投影到另一个坐标系中。其他应有的kernel操作
包括:扩充(对于每个输入元素产生多个输出元素),缩简(把一个或多个输入数据合
并为一个输出数据),过滤(把输入的一个子集作为输出)。(译者注:以上可以复合
)。

kernel的输出仅仅是它输入的函数,而且,kernel对流中任意一个元素的计算独立于对
这个流中其他元素的计算。这种限制有两个主要的好处。首先,kernel执行所需要的数
据在kernel写完(或者编译完)以后是完全知道的。kernel于是就会变的非常高效,当
它的输入元素和中间计算数据被局部存储或者被小心控制的从全局数据中索引时。(译
者乱注:反之,如果我们不能确定一个计算中要用到的数据,我们当然也就不能把所有
需要的数据都统一的局部存储或者全局索引,当然也就不会高效,不知道这么理解是否
正确)。其次,用一个简单的kernel在各个流各个数据上进行独立的计算,这就允许把
呈现线性的kernel计算映射到并行的硬件上。

在流编程模型中,可以通过把多个kernel链接在一起来构建应用程序。比如,用流编程
模型来执行图形管线包括:一个顶点处理kernel,一个三角形汇编kernel,一个裁剪le
rnel,等等。然后,把一个kernel的输出连接到下一个kernel的输入。图29-3显示了
一个完整的,被映射到流编程模型的图形处理管线。这种流模型,利用了图形管线里面
kernel间固有的数据位置,使得kernel之间的通讯变的非常清楚。

图形处理管线有几个原因使得它非常适合流编程模型。图形处理管线被传统的构建成多
个计算环节,这些环节由它们之间的数据流连接。这一结构类似于流编程模型中抽象的
流和kernel概念。(译者乱注:但是图形管线是一个线性流,而流编程模型中没有显式
的要求是线性流)。图形管线中各个环节间的数据流是高度局部化的,一个计算环节产
生的数据立即被另一个环节“消费”;在流编程模型中,流在kernel间穿梭,展现了同
样的特性。而且图形管线中各个环节所包含的计算在每个图元上都是统一的,这就可以
很简单把这些环节映射到kernel。

[高效计算]
流编程模型可以在几个方面获得计算的高效性。最重要的,在应用程序中,流支持并行
机制。因为kernel是在整个流上面操作的,流中的元素可以在数据并行的硬件上并行的
处理。(译者乱注:对于不符合这一条件的kernel,我们可以想办法分解或转化它,使
它符合并行操作的要素)。拥有很多元素的长的流可以在数据级别并行处理上获得非常
高的效率。对于单一一个元素的处理,我们可以执行指令级别的并行处理。而且由于应
用程序是由多个kernel连接而成,这些kernel可以深度管线化,并且在任务级别并行。
把感兴趣的应用分割成多个kernel让硬件执行,我们可以设计特定的硬件模块来执行特
定的kernel。对于特定的kernel,使用具有更高执行效率的专属硬件比使用(通用)可
编程硬件更适合流模型。

最终,在kernel执行中只允许有简单的控制流(比如要求在每一个流元素上执行一个函
数运算),这就可以让处理器中大多数晶体管用于数据通道而非逻辑控制。

[高效通讯]
高效通讯也是流编程模型的一个主要目标。首先,相对于独立加载或转换某一元素而言
,当整个流从内存中加载或者转换到内存时,片外(off-chip)通讯更加有效。因为相对
于处理独立元素,初始化这种转换的固定消耗可以在整个流上分期付清。其次,作为ke
rnel链的结构化程序可以把中间计算数据完全存储于片内,而不需要转换到内存。高效
的kernel试图把他们输入数据和中间计算数据保持在kernel执行单元内部,这样kernel
执行所需要的数据引用就不需要到芯片外部,或者到cache中,而这些都是经常发生在C
PU上面的。最后,执行的深度管线化,允许硬件在等待内存中返回的数据时可以持续做
有用的事情。这种对延迟的高度容忍,允许硬件对吞吐量做出优化,而不是延迟本身。
(译者乱注:就是硬件反正也有事情做,你就可以趁机多传一点东西,而不需要为了不
延迟,而每次只传很少的数据)。

29.3.2构建流处理器
流编程模型使程序结构化,同时支持并行和高效通讯。然后用流编程模型来表达程序仅
仅是解决方案的一半。高性能的图形硬件必须使用高效的算术运算和高效的流计算。我
们应该怎样确定我们的GPU硬件结构以获得全面的高性能呢?

第一步是把图形管线中的kernel映射到单一芯片的独立计算单元。芯片上每一个独立的
区域上的kernel按照task parallel的组织方式来执行。这种组织方式不但允许任务级
的并行(因为所有的kernel可以同时执行),而且可以实现硬件特化,对应于每一个给
定kernel里面的每一个函数计算单元。这个task parallel组织方式还支持kernel间高
效的通讯:因为计算相邻kernel的硬件单元在芯片上的物理位置也是相邻的,这样它们
之间就可以进行高效的通讯而不需要全局内存存取。

在每一个映射到芯片上的(图形管线)环节的内部,GPU谋求流数据元素的独立性,当
并行执行多个数据时。由于同时拥有任务级和数据级的并行,GPU有利于同时运行众多
的函数计算单元。

图形管线的输入必须顺次被各个kernel处理。因此,完整的处理一个元素就需要上千个
时钟周期。当处理数据过程中需要一个高延迟的内存引用时,一方面数据在被取出,另
一方面处理单元可以继续在其他元素上操作。于是,深度管线化的GPU,有效的支持高
延迟的操作。

很多年以来,组成图形管线化的kernel在硬件中都是固定的计算单元,几乎不支持用户
可编程特性。在2000年,GPU第一次允许用户在图形管线中对个别kernel进行编程。今
天的有着高性能数据并行处理器的GPU,在图形管线中包含了两个kernel:一个vertex 
program,它允许用户在通过管线的每一个顶点上执行一段程序,和一个fragment 
program,它允许用户在每个fragment上执行程序。这两个环节都支持单精度浮点计算
。尽管这些kernel主要的目的是为了提供给用户更灵活的渲染和光照计算,它们的这种
在用户自定义程序中提供高性能和足够精度的计算的能力,使得它们成为了一种可编程
流处理器--这种处理器能提供更广阔的应用计算,而并非仅仅是图形管线计算。

29.4 未来和挑战
GPU往可编程流处理器的变迁到达了几次历史趋势的顶点。第一次趋势是在一个单处理
器模(single processor die)中集成大量的计算单元。同等重要的是GPU设计者们高
效使用计算资源的能力和天分。每年大概有好几千万片处理器被生产出来,与此规模对
应的节约以使GPU的成本下降到足以让GPU成为现在台式电脑的一种标配。而且,管线的
高精度可编程性已经完成,这是一种变迁,从硬连的专用的处理器,变为拥有超强能力
的,可处理广泛计算的处理器。
那么,我们在未来的GPU开发中都能期待些什么呢?

29.4.1挑战: 技术趋势
每一次硬件新的演化,都给GPU的生产商们带来挑战:他们该怎样有效的把硬件的新增
资源转化为性能和功能上的增长?新增的晶体管会被用来支持并行性能上的增长,和支
持管线中新的功能。我可以在未来技术的变化中看到这一架构的演化。

就像我们在29.1.2节中提到的,未来的架构将更多的使用晶体管(计算)来代替通讯(
译者乱注,这也算是一种高效通讯吧,就是无需通讯)。我们可以期待更具挑战性的ca
che技术,它不但可以减轻片外通讯的压力,也可以减轻片内通讯的压力。我们还可以
看到,在适当的时候,越来越多的计算将取代通讯。比如,我们原来用一张纹理贴图作
为一个查找表,而现在我么可能会选择在查找表中动态的计算值。再比如,相对于把数
据发送到芯片内一个比较远的地方进行计算再把结果返回,我们可以在局部简单的复制
资源并且直接计算结果。在communicate和recompute/cache的权衡中,我们会越来越多
的选择后者。

29.4.2 挑战:能源管理
在怎样使用未来GPU晶体管的想法上,必须要考虑到实际的消耗。因为每一次硬件进化
都需要提高能源需求,能源的管理已经成为现代GPU设计中关键的一环。未来对于硬件
内一些独立的部分将使用更多的具有挑战性的动态能源管理,对于GPU中能源消耗
很大的模块使用更多的自定义或者power-aware设计,对于高端的GPU,使用更复杂精巧
的冷却管理。技术的趋势暗示能源的需求会一直伴随着芯片的演化而增长,所以这一领
域就是一个很重要的挑战。

29.4.3 挑战:支持更多的功能和可编程性
虽然现在的图形硬件相比于以前已经相当程度的支持了可编程性,然后通用计算的GPU
离我们的设想还有很远。试图接近这一趋势的一个转变就是在现有的两个可编程单元(
vertex和fragment)中增加更多的功能和灵活性。我们应该会看到他们的指令集不断会
聚并且增加新的功能,而且他们控制能力会越来越通用。我们甚至可以看到,为了更好
的利用资源,在这两个环节中,一些可编程硬件被共享了。GPU的构架师们必须留意到
,这些改进在GPU的核心任务上并没有影响它的性能。扩充图形硬件的可编程性,会使
几何图元的处理从中受益,所以我们很快就会看到在表面,三角形和象素上面的编程处
理。

在GPU生产商在图形管线中提供更复杂的各种渲染计算的时候,很多研究者利用GPU来做
图形渲染管线之外的事情。这本书<GPU GEMS 2>就包含了很多这方面的例子,基于GPU
通用计算(GPGPU)的团体在视觉模拟,图象处理,数字方法和数据库等方面都有了利
用GPU解决问题的成功尝试。我们可以期待,随着GPU在性能和功能上持续的发展,往这
方面的努力也会增加起来。

历史上,我们曾看到应该属于GPU执行的功能是由CPU来计算的。早期可供普通消费者使
用的图形硬件根本不能执行几何处理。仅仅在五年前,整个图形管线才被完整的集成在
图形芯片中。也就是从那时起,GPU功能的改变主要朝向着图形管线的可编程化。我们
不能想象GPU生产商会停止往GPU加入新的功能,实际上,今天的很多游戏都需要大量的
物理计算和人工智能计算,而这些都会影响GPU的发展。(译者注:以后就不应该叫图
形处理器了,应该叫高性能流处理器;)

29.4.4 挑战:GPU-CPU?
我们可以负责任的说,在GPU不断的把新功能增加到自己芯片内的时候,CPU的生产商是
不会停滞不前的。每次处理器演化所带来的晶体管数量增长最终会导致CPU生产和GPU生
产之间的矛盾。CPU作为未来计算机系统的核心,会不会集成一个GPU,或者在CPU内部
直接支持流功能?又或者,GPU成为计算机系统的核心,然后在GPU内部集成CPU的功能
?如此重量级的问题会给下一代处理器的构架师们带来让我们激动的挑战。 

译者:通讯,还是计算?
如何权衡,就是我们在思考程序架构时可以考虑的有意思的事情 

B Color Smilies

你可能喜欢

流结构和技术趋势(摘译) 
联系
我们
快速回复 返回顶部 返回列表