概述
现代技术允许今天的处理器设计者把极大的计算资源合并入最新的芯片中。这些体系结构的挑战是把能力的增加转换成性能的增加。过去十年图形处理器的发展表明,GPU设计者令人吃惊地完成了这项任务。在本章中,我们分析影响GPU构建方式的技术和体系结构的趋势,以及在未来可以预计的情况。
29.1 技术趋势
作为计算机用户,我们已经习惯了与上一代相比,每一代新计算机硬件都运行得更快,也有了更多的功能,而且通常价格更低。这种大幅度的发展由于持续进步的内在技术——每块芯片上可以放置更多的处理能力——而成为可能。每年在国际半导体技术路线图(ITRS)上,半导体产业展望芯片的许多重要的度量方法,如晶体管的大小,每个芯片上晶体管的数量,以及整体能源消耗,将在近些年内改变(ITRS 2003)。这些计划对做芯片和制造芯片设备的公司产生了极大的冲击,也包括下一代芯片的设计者。在本节中,解释了未来我们可以期望的一些趋势,也包括它们对下一代图形处理器发展的意义。
29.1.1 核心技术趋势
今天的处理器由百万个晶体管相互连接的切换设备构建而成。随着处理技术的进步,这些晶体管和它们之间的连接,可以集成在一个很小的范围内。1965年,Gordon Moore注意到可以经济地制造在单个处理器核心(die)上的晶体管数量每年都翻倍(Moore 1965)。Moore指出在将来这样的增长可能持续。这个经常被引述的预言,名为Moore定律,在今天意味着每年一个核心上大约可以多放置50%的组件。自Moore提出他的预言40年来,每个核心上的晶体管数量从五十(1965)发展到上亿(2005),而且预计增长速率可以持续至少10年。
新一代芯片不仅增加了晶体管数量,而且减小了晶体管大小。由于它们更小,这些晶体管可以比它们的前辈进行更快的操作,允许芯片总体上运行得更快。从历史来看,晶体管速度每年提高15%(Dally和Poulton 1998)。在现代处理器中,一个称为时钟的全局信号同步了发生在处理器各处的计算,所以处理器用户看到的晶体管速度增加反映为一个更快的时钟。同时,晶体管数量和时钟速度的增加合成了处理器能力,以每年71%的速率加快。能力的逐年增长意味着我们可以预计在一个芯片上比前一年多71%的计算。
半导体计算机存储器,虽然与处理器逻辑使用略微不同的制造方法,但也在制造技术上受益于相似的进步。ITRS展望商品化的动态随机访问存储器(DRAM)容量将继续每3年翻一翻。DRAM性能可以以两种方式测量:带宽,它测量每秒钟能传输多少数量的数据;延迟,测量数据请求时间和返回时间之间的时间。DRAM性能并不像处理器能力增长得那么快。DRAM带宽每年增长25%(ITRS 2003,表4c、4d),而DRAM延迟每年只增长5%。
29.1.2 后果
总的来说,大多数趋势都是好的:在制造技术的各个新世代,处理器能力、存储器带宽和存储器延迟全都得到了改善。例如,逐年的能力增加导致单个核心上的高度整合。15年前,设计者只是刚刚开始把浮点算术单元集成到处理器核心;今天,这样的单元只占用了不到1mm2的核心面积,而且同一个核心上可以放置上百个浮点算术单元。
然而,这些技术发展最重要的后果是它们之间的区别。当某一指标的变动速度和其他速率不同时,就会要求重新考虑在处理器和系统设计背后的假设。我们可以鉴别出将帮助驱动未来GPU体系结构的3个主要问题:计算与通信,延迟与带宽,功率。
1. 计算与通信
随着时钟速度和芯片大小的增加,一个以时钟周期测量的信号通过整个芯片的时间也增加了。在今天最快的处理器上,从芯片的一端发送信号到另一端一般要求多个时钟周期,而且这个时间量随着新一代处理器的出现而增加。我们可以用“在通信上的开销与计算的开销之比的增加”来描绘这一趋势。结论是,未来的设计者将越来越通过廉价的晶体管产生的计算代替昂贵的通信需要。另一个可能的冲击将是存储器带宽的每个字对应计算量的增加。例如,比较NVIDIA的最新3款旗舰GPU(2002的GeForce FX 5800、2003的GeForce FX 5950和2004的GeForce 6800),测量可编程浮点性能峰值对芯片到存储器的带宽峰值。GeForce FX 5800可以为芯片外带宽的每个字进行两次浮点操作,GeForce FX 5950可以进行2.66次操作,而GeForce 6800可以进行接近6次操作。我们预计这个趋势在未来芯片世代中会持续存在。图29-1显示了在一系列GPU体系结构中,每秒进行的浮点操作和有效存储器带宽的历史数据。
图29-1 快速改变的GPU能力
图注:在GeForce FX 5800、5950和GeForce 6800上,每秒进行的浮点操作数快速增长,而芯片外的存储器带宽增加就慢得多了(数据来自Stanford大学的Ian Bunk)。
2. 延迟与带宽
在带宽和延迟趋势之间的沟壑也是未来体系结构的一个重要驱动力。由于延迟仍将比带宽提升的速度慢得多(Patterson 2004),为了容忍越来越大的延迟量,设计者必须实现解决方案,使等待数据从需要花费很长时间的操作返回时继续在做有用的工作。
3. 功率
虽然比较小的晶体管功率小于比较大的晶体管,但一个处理器核心上的晶体管数量增加的速度快于单个晶体管减少的功率。结果,每一代处理器都要求更多的功率:ITRS估计2004年的芯片与散热器的最大功率是158W,而且在2008年以前将逐渐上升到顶峰的198W。这个功率限制是未来处理器的主要局限之一;未来的价值指数也许不再是每秒操作的数量而是每秒每瓦操作的数量。
图29-2总结了在下个10年间,在能力、DRAM带宽、DRAM延迟和功率方面变化的展望。
图29-2 随着时间的变化,GPU关键属性的改变
29.2 高性能计算的关键
在29.1节,介绍了现代技术使硬件的各个新世代的能力稳定增强。有效地运用计算资源的财富要涉及到两个重要目标。首先,必须组织计算资源,以使重要的应用程序拥有高性能。然而,只是提供大量计算并不够;必需实现通信的高效管理,必须填满芯片上的计算资源。本节描述了允许我们达到高效计算和高效通信的技术,我们还要讨论为什么现代微处理器(CPU)是为实现这些目标的一次拙劣匹配。
29.2.1 高效计算的方法
在第29.1节,我们看见可以在一个核心上放置成百上千个计算单元。为了计算的目的最佳利用晶体管的关键是使致力于计算的硬件最大化,允许多个计算单元通过并行同时操作,而且保证各个计算单元以最大效率操作。
虽然现代技术允许我们在一个核心上放置大量的晶体管,但资源不是无限的。我们对晶体管的使用可以广义地划分成3类:控制,硬件用来指挥计算;数据通路(datapath),硬件用来执行计算;及存储,硬件用来存放数据。如果我们的目标是最大化性能,就必须使硬件和软件确保允许我们最大化致力于执行计算的数据通路的晶体管。
在数据通路之内,可以允许在相同时间的并发操作。这个技术被称为并行性。我们可以构想几个方式以利用并行性和允许同时执行。复杂任务,比如图形处理,一般由几项连续的任务组成。当运行这些应用时,我们能够在不同的数据上同时运行几个这样的任务(任务并行性)。在一个阶段之内,如果在几个数据元素上执行一个任务,我们能够利用数据并行性同时对数据求值。而在一个数据元素的复杂求值之内,能够同时求值几个简单操作(指令并行性)。要有效使用上百个计算单元,可以利用任何一个或所有这些类型的并行性。
在每个任务之内,我们可以使每个算术单元都完全可编程,因而能执行任何任务。然而,利用晶体管特化能获取更多的效率。如果一个特定算术单元只执行一种计算,那么那个单元就可以被特化为相应的计算,可以大大提升效率。例如,三角形光栅化,屏幕空间的三角形被变换成覆盖三角形的片段,当光栅化任务以专用硬件而不是可编程硬件实现时,可以得到极大的效率优势。
29.2.2 高效通信的方法
如同在第29.1.2节看见的,芯片外带宽比芯片上的算术能力增长慢得多,所以高性能处理器必须最小化芯片外通信。减少这个开销的最简单方式是消灭它:现代处理器试图尽可能保持只需要在芯片内进行数据通信,芯片外通信只用于获取或保存真正的全局数据。
其他常见的减少通信增长开销的方式是通过cache:最近使用的数据存储器的副本存放在芯片上,如果再次用到该数据,就不需要从芯片外获取。这样的数据cache在未来体系结构中将变得更普遍,扩展到可以减轻芯片内通信需要的局部cache或用户控制的存储器。这些cache有效地把晶体管从cache存储器的形式变换为带宽。另一个强有力的技术是压缩:在芯片外只传送和存放压缩形式的数据。压缩也是把晶体管(压缩和解压硬件)和计算(压缩/解压操作)变换为芯片外带宽。
29.2.3 与CPU对比
今天的高性能微处理器和计算机图形流水线的目标不同,瞄准于通用应用程序。一般来说,与渲染流水线相比,这些通用程序并行性较少,需要较复杂的控制和较低的性能目标。结果,我们前面列举的设计目标不涉及CPU,而且CPU有不同的设计选择,导致很难映射到图形流水线和许多其他有类似属性的应用程序。
CPU编程模型一般是串行的,在它们的应用程序中不会充分利用数据并行性。CPU硬件反映了这个编程的模型:在常见的情况中,CPU在一个时刻只处理一个数据,不利用数据的并行性。它们做了一个令人敬佩的工作——利用指令并行性,而最近的CPU增加了指令集,例如Intel公司的SSE和PowerPC的AltiVec允许一些数据并行执行,但CPU所利用的并行程度比GPU少得多。
并行硬件在CPU数据通路中较不流行的一个原因是设计者把更多的晶体管用于控制硬件。CPU程序比GPU程序所要求的控制要复杂得多,所以CPU晶体管和连线有很大一部分用于实现复杂的控制功能,如分支预测和乱序执行。结果,CPU的核心只有很少一部分用于计算。
由于CPU的目标是通用程序,所以它们不为特殊功能包含专门的硬件。然而,GPU可以为特殊任务实现专用硬件,远远比通用可编程解决方案所提供的效率高得多。
最后,CPU内存系统被优化为极小的延迟而不是GPU内存系统瞄准的最大吞吐量。由于缺乏并行性,CPU程序必须尽快返回内存引用以继续前进。结果,CPU内存系统包含几级cache存储器(作为芯片晶体管数量的一个固定比率)以最小化延迟。然而,cache对很多数据类型是无效的,包括图形输入和只访问一次的数据。对于图形流水线,为所有元素最大化吞吐量而不是为所有元素最小化延迟会导致更好地运用内存系统和高性能的整体实现。
29.3 流式计算
在29.2节,介绍了构建高性能处理器需要高效计算和高效通信。CPU非常不适合用于许多高性能应用程序的部分原因是它采用串行编程模型,在这种应用程序中无法利用并行性和通信模式。在本节中,我们描述流式编程模型,它以允许高效计算和通信的方式构造程序(Kapasi等,2003)。这个编程模型是今天GPU编程的基础。
29.3.1 流式编程模型
在流式编程模型中,所有数据都表现为流。我们把流定义为具有相同数据类型的数据的有序集。数据类型可以是简单的(整数或浮点数流)或复杂的(点或三角形或变换矩阵流)。流可以是任意长度,如果流很长(流中有上百或更多的元素),那么流上的操作效率将很高。流上允许的操作包括复制它们,从它们导出子流,用一个单独的索引流索引入它们,以及用核在它们上执行计算。
核操作整个流,获取一个或多个流作为输入并产生一个或多个流作为输出。核的定义特征是它操作多个流上的所有元素而不是独立的元素。对核的最典型用途是对输入流的每个元素用一个函数进行求值(“映射”操作)。例如,变换核可能把一个点组成的流的每个元素投影到另一个坐标系统中。其他常见的核操作包括扩展(对每个输入元素产生一个以上输出元素),缩减(把一个以下元素合并为单个输出元素)及过滤(输出输入元素的一个子集)。
核的输出是函数只作用于其核输入的结果,并且在核之内,对流元素的计算从不依赖于在其他元素上的计算。这些制约有两个主要好处。首先,当写核(或编译)时,核执行所需要的数据完全已知。因此,当它们的输入元素和中间计算数据储存在局部或是仔细控制的全局引用时,核可以非常高效。其次,在一个核之内对不同的流元素需要独立计算,这允许把看起来像串行核计算的内容映射到数据并行的硬件。
在流式编程模型中,通过把多个核串联在一起来构建应用程序。例如,在流式编程模型中实现图形流水线需要写一个顶点程序核、三角形汇编核、剪切核等,然后把一个核的输出连接到下一个核的输入。图29-3显示了整个图形流水线是怎样映射到流式模型的。这个模型明确了核之间的通信,利用了图形流水线固有的核之间的数据局部性。
图29-3 把图形流水线映射成流式模型
图注:图形流水线的流式化把所有数据表达成流(由箭头表明),所有计算表达成核(由框表明)。图形流水线中的用户可编程和不可编程阶段都可以表达成核。
图形流水线在几方面都很好地匹配了流式模型。图形流水线传统上被构造为多个计算阶段,由阶段之间的数据流连接。这个结构近似于流式编程模型的流和核的抽象。图形流水线中阶段之间的数据流是高度局部化的,一个阶段产生的数据立刻被下个阶段所消耗;在流式编程模型中,流在核之间的穿行也显现出相似的行为。而且在流水线的各个阶段所调用的计算在不同的图元之间一般是一致的,使这些阶段很容易映射成核。
1. 高效计算
流式模型用多种方式实现了高效计算。最重要的是,流利用了应用程序中的并行性。由于核操作整个流,流元素可以用数据并行硬件并行地处理。有很多元素的长流使数据级的并行性有很高的效率。在处理一个元素时,可以利用指令级并行性。而且因为应用程序由多个核构建而来,多个核可以用任务级并行性进行深度流水线处理和并行处理。
把重要的应用程序划分成核可以把硬件实现成执行一个或多个核的特殊硬件。专用硬件比可编程硬件的效率高得多,可以适当用在这个编程模型里。
最后,在核执行时只有一个简单的控制流程(比如在各个输入元素上数据并行地用一个函数求值),允许硬件实现把大多数晶体管用于数据通路硬件而不是控制硬件。
2. 高效通信
高效通信也是流式编程模型的主要目标之一。首先,当整个流(而不是独立元素)转移到内存或从内存转移时,芯片外(全局)通信比较高效,因为初始化转移的固定开销可以分摊到整个流中,而不是单个元素。其次,用核构造应用程序作为链允许核之间的中间结果保存在芯片内,不需要转移到内存或从内存转移。高效的核试图把它们的输入和中间计算数据保持在局部,即在核的执行单元之内;因此,核执行内部的数据引用不用把数据从芯片外或跨芯片取到数据cache,如同经常出现在CPU的一样。最后,执行的深度流水浅化允许硬件实现在等数据从全局内存中返回时继续完成有用的工作。这样的高度延迟容忍允许硬件为吞吐量(而不是延迟)实现优化。
29.3.2 构建一个流式处理器
流式编程模型用暴露并行性和允许高效通信的方法构造程序。然而,用流式模型表达程序只解决了一半问题。高性能图形硬件必须有效地利用流式模型提供的高算术性能和高效计算。如何构造GPU的硬件实现以保证最高的整体性能呢?
构建一个高性能GPU的第一步是把图形流水线中的核映射成单个芯片上的独立功能单元。因而在芯片不同区域实现的每个核在组织中称为任务并行,任务并行不仅允许任务级的并行性(因为所有核可以同时执行),而且各种功能单元对给定的核做了硬件特化。任务并行的组织也允许在核之间高效通信:因为图形流水线中的功能单元实现的相邻核是毗邻在芯片上的,它们可以在不需要全局存储器访问的情况下有效地通信。
在映射到芯片上的处理单元的图形流水线各个阶段之内,GPU通过并行地处理多个数据元素来利用各个流元素之间的独立性。任务级和数据级平行性的组合允许GPU同时有利地使用许多功能单元。
图形流水线的输入必须由各个核顺序处理。结果,它也许需要上千个周期来完成对一个元素的处理。如果在处理任何元素的过程中需要一个高延迟的内存引用,那么当正在获取数据时处理单元只需要工作于其它元素就即可。所以,现代GPU的深度流水线有效地容忍了高延迟操作。
多年以来,组成图形流水线的核在图形硬件里被实现成提供极少或完全没有可编程性的固定功能单元。2000年,GPU第一次给予了用户可以对图形流水线中独立的核编程的机会。今天的GPU是高性能数据并行处理器,在图形流水线中实现了两个核:顶点程序,允许用户在通过这条流水线的每个顶点上运行一个程序,片段程序,允许用户在各个片段上运行的一个程序。这两个阶段都允许单精度浮点计算。虽然这些附件主要是为了提供用户更灵活的着色和光照运算,但它们可以承受用户指定程序的高速率计算,有高效地解决通用计算问题所需的精度,这使它们成为可编程流式处理器,即对各种各样的应用程序而不仅是图形流水线有吸引力的处理器。
29.4 未来和挑战
GPU转变成为可编程流式处理器反映了一些历史趋势的汇聚。第一个趋势是把大量计算集中到一个处理器核心的能力。同样重要的是GPU设计者在有效地使用这些计算资源方面的能力和才能。与每年制造数千万处理器有关的经济效益已经允许GPU的费用降到足以使GPU成为今天台式计算机的标准部分。而且对流水线的适当高精度可编程的附件已经完成了从硬连线的专用处理器到可以解决各种各样任务的、强大的可编程处理器的过渡。
然后,我们可以期待未来GPU有哪些发展?
29.4.1 技术趋势
每代新硬件对GPU厂商来说都是一个挑战:他们如何有效地使用附加的硬件资源来增加性能和功能?新的晶体管将致力于增加性能,大部分通过并行的数量和流水线中的新功能实现。我们也将看到随着技术的改变,这些体系结构将进化。
正如在29.1.2小节中描述的,将来的体系结构将会逐渐使用晶体管代替对通信的需要。我们期待着更主动的cache技术,不但可以减轻芯片外的通信,而且可以减少一些芯片内通信。我们也将会看见计算逐渐地在合适的时候代替通信。例如,把纹理存储器用作一个查找表的方法可能被动态地计算那个查询表中的数值代替。“把数据发送到芯片上很远的计算资源然后把结果送回来的情况”可以用“仅仅复制资源并在局部计算结果”的方法代替。在通信和重新计算/cache之间的权衡中,将会逐渐地选择后者。
通信开销的逐渐增加也将会影响将来芯片的微体系结构。设计者现在必须明确地计划把数据发到芯片另一端所需要的时间;甚至局部通信时间在时间预算中也变得很重要。
29.4.2 功耗管理
关于如何使用未来GPU晶体管的想法必须被它其开销的现实所平衡。当每代硬件都增加它的功耗需求时,功耗管理已经变成当今GPU设计的一个关键。未来可能对不同的阶段采用更主动的动态功耗管理;为GPU的大功耗部分增加定制或控制功耗的设计;对高端GPU采用更成熟的冷却管理。技术趋势指出,功耗需求在未来的芯片世代中只会继续上升,所以继续在这个领域努力仍将是一个重要的挑战。
29.4.3 支持更高的可编程性和功能性
虽然目前这代图形硬件实际上比以前几代有更多的可编程性,但GPU的通用编程性仍不理想。靠近这个趋势的是改善目前两个可编程单元(顶点和片段)的功能性和灵活性。我们可能会看见它们的指令集变为一致并增加功能性,而且它们的控制流程能力也将变得更通用。甚至可以看到设法在这两个阶段之间共享可编程硬件,以更好地利用这些资源。然而,GPU体系结构设计者必须注意的是这些进步不该影响在GPU核心任务上的性能。另一个选择是把可编程性扩大到不同的单元。可编程性对几何图元特别有用,所以我们可能很快可以看到在表面、三角形和像素上的可编程处理。
随着GPU厂商支持更通用的流水线和更复杂更多样的着色器计算,许多研究员已经用GPU去实验完成图形流水线界线之外的任务了。本书包含很多这些方面的例子;GPU上的通用计算(GPGPU)社区已经成功将用图形硬件扩展到视觉模拟、图像处理、数值方法和数据库的问题。可以预计在未来,随着GPU性能和功能的继续增加,这些努力将会进一步发展。
从历史来说,GPU包括了原先属于CPU的功能。早期的消费级图形硬件在图形处理器上无法执行几何处理;从整个图形流水线可以制造在单个芯片上到现在只用了5年。虽然从那时起GPU功能的主要增加已经是图形流水线中的可编程性,但是不应期待GPU厂商停止致力于把更多的功能整合到GPU上。尤其是今天的游戏经常需要大量的物理和人工智能计算。这样的计算可能对将来的GPU是有吸引力的。
29.4.4 来自CPU的GPU功能性(或反之亦然)
我们相信,当GPU将越来越多的处理功率和能力合并到未来的芯片上时,CPU厂商将不会停滞不前。每一代处理器增加的晶体管数目可能最后导致CPU和GPU制造商之间的矛盾。将来计算机系统的核心是CPU,而将GPU或流功能最后合并到CPU本身?或者未来的系统将以GPU为核心,CPU功能将合并入GPU?如果向着令人兴奋的未来看去,这样的重量级问题将会是下代处理器的体系结构设计者所面临的挑战。
最后
以上就是执着大神为你收集整理的GPU技术趋势的全部内容,希望文章能够帮你解决GPU技术趋势所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复