GPU计算外文翻译资料

 2022-08-11 11:08

英语原文共 22 页,剩余内容已隐藏,支付完成后下载完整资料


GPU计算

摘要:图形处理单元(GPU)已经成为当今主流计算系统的重要组成部分。在过去的六年里,GPU的性能和能力有了显著的提高。现代的GPU不仅是一个强大的图形引擎,而且是一个高度并行的可编程处理器,具有峰值运算和内存带宽,远远超过它的CPU对手。GPU在可编程性和能力方面的快速增长催生了一个研究团体,该团体已经成功地将大量计算要求高、复杂的问题映射到GPU上。这种基于GPU的通用计算,也被称为GPU计算,目前已经将GPU定位为未来高性能计算机系统中传统微处理器的一个替代者。我们描述了GPU计算的背景、硬件和编程模型,总结了工具和技术的最新进展,并介绍了四种GPU计算在游戏物理和计算生物物理方面的成功,它们在优化的CPU应用程序上提供了数量级的性能提升。

关键字:基于图像处理单元(GPGPU)的通用计算,GPU计算,并行计算

介绍

并行是计算的未来。未来微处理器的开发工作将继续集中于添加核心,而不是提高单线程性能。体现这一趋势的一个例子是异构的9核宽带引擎,它是索尼Playstation 3的主处理器,也引起了科学计算社区的极大兴趣。类似地,高度并行图形处理单元(GPU)作为计算要求高的应用程序的强大引擎,也正迅速成熟起来。GPU的性能和潜力为未来的计算系统提供了很大的希望,然而GPU的架构和编程模型与大多数其他的普通单片机处理器有显著的不同。

该GPU是为具有以下特征的特定应用程序类设计的。在过去的几年里,一个不断增长的社区发现了其他具有类似特征的应用程序,并成功地将这些应用程序映射到GPU上。

1)计算需求很大。实时渲染需要每秒数十亿像素,每个像素需要数百个或更多的操作。GPU必须提供大量的计算性能,以满足复杂的实时应用程序的需求。

2)并行性高。幸运的是,图形管道非常适合并行性。对顶点和片段的操作与细粒度的紧密耦合可编程并行计算单元匹配得很好,而这些并行计算单元又适用于许多其他计算领域。

3)吞吐量比延迟更重要。图形管道的GPU实现优先考虑吞吐量而不是延迟。人类的视觉系统以毫秒为单位运作,而现代处理器的操作时间为纳秒。这六个数量级的差距意味着任何单个操作的延迟都不重要。因此,图形管道非常深,可能有数百到数千个周期,在任何给定时间都有数千个原语在运行。管道也是前馈的,消除了控制风险的惩罚,进一步允许原语通过管道的最佳吞吐量。这种对吞吐量的强调也是其他领域应用程序的特点。

六年前,GPU是一个固定功能的处理器,围绕着图形流水线构建,擅长于三维(3-D)图形,但除此之外就没什么了。从那时起,GPU已经发展成为一个强大的可编程处理器,应用程序编程接口和硬件都越来越关注于GPU的可编程方面。其结果是一个具有强大运算能力的处理器(一个单独的NVIDIA GeForce 8800 GTX可以维持超过330浮点运算每秒(Gflops))和流式内存带宽(80 GB/s),两者都比高端CPU大得多。GPU有一个独特的架构,它围绕着大量的细粒度并行处理器,我们将在第二节中讨论这些处理器。

在GPU的发展过程中,编程模型和编程工具的进步与通用计算引擎同样重要。GPU供应商和研究人员面临的挑战是,在底层访问硬件以提高性能和高级编程语言和工具以提高程序员的灵活性和生产力之间取得适当的平衡,所有这些都面临着硬件的快速发展。在第三节中,我们将讨论如何将通用程序映射到GPU上。

直到最近,GPU计算还可以被描述为一种学术实践。由于工具和技术的原始性质,第一代应用程序以简单工作而著称。随着该领域的成熟,技术变得更加复杂,与非GPU的比较也更加严格。我们最近对该领域的调查(完成于2006年11月)总结了GPU计算的这个时代。我们现在进入了GPU计算的第三个阶段:构建真正的应用程序,在这些应用程序上GPU显示出明显的优势。

2、GPU架构

GPU一直是一个拥有大量计算资源的处理器。然而,最近最重要的趋势是将计算暴露给程序员。在过去的几年里,GPU已经从一个固定功能的特殊用途处理器发展为一个功能完备的并行可编程处理器,并增加了固定功能的特殊用途功能。与以往任何时候相比,处理器的可编程方面已经占据了中心舞台。

我们先从图形管道的结构和GPU如何成为通用架构开始,记录这种演变,然后再仔细看看现代GPU的架构。

A、图形管道

GPU的输入是一个几何原语列表,通常是三角形,在一个三维世界坐标系统中。通过许多步骤,这些原语被着色并映射到屏幕上,在那里它们被组装起来以创建最终的图像。在展示管道如何变得可编程之前,先解释一下规范管道中的具体步骤是很有意义的。

顶点操作:输入原语由单个顶点构成。每个顶点必须转换成屏幕空间和阴影,通常通过计算它们与场景中的灯光的相互作用。因为典型的场景有成千上万的顶点,而且每个顶点都可以独立计算,所以这个阶段非常适合并行硬件。

原始装配:顶点被装配成三角形,这是当今GPU中硬件支持的基本原语。

栅格化:栅格化是确定每个三角形所覆盖的屏幕空间像素位置的过程。每个三角形在它所覆盖的屏幕空间像素位置上生成一个称为Bfragment的原语。因为许多三角形可能在任何像素位置重叠,所以每个像素的颜色值可以从几个片段中计算出来。

片段操作:使用顶点的颜色信息,并可能从全局获取额外的数据以纹理(映射到表面的图像)的形式存储,每个片段都被着色以确定其最终颜色。就像在顶点阶段,每个片段可以并行计算。这个阶段通常是图形管道中计算要求最高的阶段。

合成:片段被组装成一个最终的图像,每个像素一个颜色,通常通过保持最接近相机的片段为每个像素的位置。

从历史上看,在顶点和碎片阶段可用的操作是可配置的,但不可编程。例如,在顶点阶段的一个关键计算是计算每个顶点的颜色作为一个函数的顶点属性和场景中的灯光。在固定函数管道中,程序员可以控制顶点和灯光的位置和颜色,但不能控制决定它们之间相互作用的灯光模型。

B、GPU架构的演进

固定功能的管道缺乏通用性,无法有效地表达更复杂的阴影和照明操作,而这些操作对于复杂的效果至关重要。关键的一步是用在每个顶点和片段上运行的用户指定的程序替换每个顶点和片段的固定函数操作。在过去的六年里,这些顶点程序和片段程序已经变得越来越有能力,它们的大小和资源消耗有了更大的限制,有了更全功能的指令集,有了更灵活的控制流操作。

bull;硬件必须支持至少65k静态指令和无限动态指令的着色程序。

bull;指令集第一次同时支持32位整数和32位浮点数。

bull;硬件必须允许对全局内存(纹理)进行任意数量的直接和间接读取。

bull;最后,必须支持循环和分支形式的动态流控制。

随着着色器模型的发展和功能的增强,以及各种类型的GPU应用程序增加了顶点和片段程序的复杂性,GPU架构越来越关注图形管道的可编程部分。事实上,虽然前几代gpu可以被描述为对固定功能管道的可编程性的补充,但是今天的gpu被更好地描述为一个被支持固定功能单元包围的可编程引擎。

C、现代GPU的架构

在第一部分中,我们注意到GPU是为不同于CPU的应用需求而构建的:

并行计算需求,强调吞吐量而不是延迟。因此,GPU的架构朝着与CPU不同的方向发展。

考虑一个任务管道,就像我们在大多数图形API(和许多其他应用程序)中看到的那样,它必须处理大量的输入元素。在这样的管道中,每个后续任务的输出被输入到下一个任务的输入中。管道暴露了应用程序的任务并行性,因为可以同时计算多个管道阶段的数据;在每个阶段中,同时计算多个元素是数据并行性。要执行这样的管道,CPU将使用单个元素(或一组元素)处理管道中的第一阶段,然后处理下一阶段,依此类推。CPU及时地划分管道,依次将处理器中的所有资源应用到每个阶段。

GPU历来采取不同的方法。GPU将处理器的资源分配到不同的阶段,这样流水线就被划分为空间,而不是时间。在一个阶段工作的处理器部分将其输出直接提供给下一个阶段工作的不同部分。

这种机器组织在固定功能的GPU中非常成功,原因有两个。首先,任何给定阶段的硬件都可以利用该阶段内的数据并行性,同时处理多个元素。由于多任务并行阶段随时运行,GPU可以满足图形流水线的大计算需求。其次,每个阶段的硬件可以使用特定任务的专用硬件进行定制,从而大大提高了通用解决方案的计算和区域效率。例如,在专用硬件中实现的栅格化阶段(为每个输入三角形计算像素覆盖信息)的效率更高。随着可编程阶段(如顶点程序和分段程序)取代固定功能阶段,专用固定功能组件被可编程组件取代,但任务并行组织没有改变。

其结果是一个冗长的,前馈GPU管道与许多阶段,每一个典型地加速特殊用途的并行硬件。在一个CPU中,任何给定的操作在进入和离开CPU管道之间可能需要20个周期。在GPU上,一个图形操作从开始到结束可能需要数千个周期。任何给定操作的延迟都很长。然而,跨阶段和阶段之间的任务和数据并行性提供了高吞吐量。

GPU任务并行流水线的主要缺点是负载均衡。与任何管道一样,GPU管道的性能取决于它最慢的阶段。如果顶点程序是复杂的,片段程序是简单的,那么总体吞吐量取决于顶点程序的性能。在早期可编程阶段,顶点程序和片段程序的指令集是完全不同的,所以这些阶段是分开的。然而,随着顶点和片段程序的功能变得更加强大,指令集也逐渐趋同,GPU架构师重新考虑了一个严格的任务并行管道,转而支持一个统一的着色器架构,在这个架构中,管道中的所有可编程单元共享一个单一的可编程硬件单元。虽然大部分管道仍然是任务并行的,可编程单元现在将它们的时间分配到顶点工作、片段工作和几何工作中(使用新的DirectX 10几何着色器)。这些单元可以利用任务并行性和数据并行性。随着可编程部件在管道中的应用越来越多在图形管道的计算中,GPU的架构正在从严格的流水线任务并行架构向越来越多的基于单一统一数据并行可编程单元的架构迁移。

在xbox360(2005)中,AMD在其Xenos GPU中为现代GPU引入了第一个统一的着色器架构。今天,AMD和NVIDIA的旗舰gpu都有统一的着色器(图)。1)。对GPU用户来说,好处是可以以牺牲更复杂的硬件为代价来实现更好的负载平衡。GPGPU用户的好处是显而易见的:所有的可编程电源都在一个硬件单元中,GPGPU程序员现在可以直接针对那个可编程单元,而不是以前那种将工作划分到多个硬件单元的方法。

图1 GPU架构

3、GPU并行计算

A、GPU编程模型

GPU的可编程单元遵循单程序多数据(SPMD)编程模型。为了提高效率,GPU使用相同的程序并行处理许多元素(顶点或片段)。每个元素都独立于其他元素,并且在基本编程模型中,元素之间不能相互通信。

每个元素都可以对32位的整数或浮点数据进行操作,并具有相当完整的通用指令集。元素可以从共享的全局内存中读取数据(Bgather操作),并且,使用最新的GPU,还可以写回共享全局内存中的任意位置。

此编程模型非常适合于直线程序,因为许多元素可以在运行完全相同的代码时按相同的步骤进行处理。以这种方式编写的代码是单指令、多数据(SIMD)。随着着色程序变得越来越复杂,程序员更倾向于允许不同的元素在同一个程序中采用不同的路径,从而得到更通用的SPMD模型。这在GPU上是如何支持的?

GPU的一个优点是它有大量的资源用于计算。为每个元素允许不同的执行路径需要大量的控制硬件。相反,现在的GPU支持每个线程的任意控制流,但是会对不一致的分支造成不利影响。GPU厂商大都采用了这种方法。元素被分组成块,块被并行处理。如果元素在一个块中以不同的方向分支,硬件将为该块中的所有元素计算分支的两边。块的大小被称为Bbranch粒度[并且在最近的GPU生成中一直在下降,它大约有16个元素。

在编写GPU程序时,分支是允许的,但不是无代价的。将代码结构为块具有一致的分支的程序员将充分利用硬件。

B、GPU通用计算

将通用计算映射到GPU使用图形硬件的方式与任何标准图形应用程序基本相同。由于这种相似性,解释这个过程既容易又困难。一方面,实际操作相同,易于跟踪;另一方面,在图形和通用用途之间,术语是不同的。Harris对这个映射过程提供了很好的描述。我们首先使用图形术语描述GPU编程,然后展示如何在通用的方式中使用相同的步骤来编写GPGPU应用程序,最后使用相同的步骤来展示当今的GPU计算应用程序编写的更简单和更直接的方式。

这个编程模型非常强大,原因如下。首先,它允许硬件通过在程序中显式地指定并行性来充分利用应用程序的数据并行性。其次,它在通用性(每个元素上的完全可编程例程)和限制之间取得了谨慎的平衡,以确保良好的性能(SPMD模型,为提高效率而进行分支的限制,元素之间和内核/通道之间的数据通信的限制,等等)。最后,它对可编程单元的直接访问消除了以前GPGPU程序员在将图形接口用于通用编程时所面临的许多复杂性。因此,程序通常用一种熟悉的编程语言表示(比如在CUDA编程环境中使用NVIDIA的c类语法),而且更简单、更容易构建和调试(随着编程工具的成熟,这种语言也变得越来越成熟)。其结果是一个编程模型,允许它的用户充分利用GPU的强大硬件,但也允许一个越来越高的编程模型,使复杂的应用程序的生产创作。

C、软件环境

在过去,大多数GPGPU编程是通过图形API直接完成的。尽管许多研究人员成功地让应用程序通过这些图形API工作,但人们使用的传统编程模型与图形API的目标之间存在根本的不匹配。最初,人们使用固定的函数、特定于图形的单位(如纹理过滤器,混合,模

剩余内容已隐藏,支付完成后下载完整资料


资料编号:[237499],资料为PDF文档或Word文档,PDF文档可免费转换为Word

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。