在本节中,我们将概述当前普遍使用的GPU系统架构。我们将讨论系统配置、GPU的功能和服务、标准编程接口以及基本的GPU内部架构。
采用GPU和CPU的异构计算机系统架构,可以从两个主要特性高层次地进行描述:首先,使用了多少功能子系统和/或芯片,以及它们之间的互连技术和拓扑结构是什么;其次,这些功能子系统可以访问哪些内存子系统。
图B.2.1展示了一台大约1990年代的传统PC的高级框图。北桥包含了高带宽接口,用于连接CPU、内存和PCI总线。南桥包含了遗留接口和设备:ISA总线(音频audio、局域网LAN)、中断控制器;DMA控制器;时间和计数器。在该系统中,显示器由一个被称为VGA(视频图形阵列)的简单帧缓冲子系统驱动,该子系统连接到PCI总线上。在1990年的PC领域中,还没有内置处理元素(GPU)的图形子系统存在。
图B.2.2和B.2.3展示了当前普遍使用的两种配置。这两种配置的特点是分别拥有独立的GPU(离散GPU)和CPU以及各自相应的内存子系统。在图B.2.2中,使用Intel CPU时,我们看到GPU通过16通道PCI-Express 2.0链路连接,提供峰值16 GB/s的传输速率(每个方向的峰值为8 GB/s)。同样,在图B.2.3中,采用AMD CPU时,GPU也通过PCI-Express与芯片组相连,具有相同的可用带宽。在这两种情况下,GPU和CPU都可以访问对方的内存,尽管其访问速度相比直接连接的内存来说要低一些。对于AMD系统而言,北桥或内存控制器已集成到与CPU相同的裸片(die)上。
PCI-Express (PCIe) :一种使用点对点连接的标准系统输入输出互连技术。这种连接具有可配置的通道数量和带宽。
统一内存架构(UMA) :一种让CPU和GPU共享同一系统内存的系统架构。
另一种高性能系统变体采用多个连接的GPU,通常为两到四个并行工作,并且它们的显示器通过菊花链方式进行连接。例如,NVIDIA SLI(可扩展链接互连)多GPU系统就是专为高性能游戏和工作站设计的。
下一个系统类别将GPU与北桥(Intel)或芯片组(AMD)集成在一起,有些配置包含专用图形内存,有些则不包含。
缓存需要在共享地址空间中维护一致性。对于CPU和GPU来说,存在多个地址空间。GPU可以通过GPU上的MMU转换的虚拟地址来访问它们自己的物理局部内存以及CPU系统的物理内存。操作系统内核管理GPU的页表。一个系统物理页面可以通过PCI-Express事务中的“一致”或“非一致”属性确定,从而进行访问。CPU可以通过PCI-Express地址空间中的一个地址范围(也称为孔径)来访问GPU的本地内存。
诸如索尼PlayStation 3和微软Xbox 360等游戏主机系统与之前描述的PC系统架构相似。这些游戏主机系统设计目标是在长达五年或更久的生命周期内保持一致的性能和功能。在这段时间里,系统可能会多次重新实现,以利用更先进的硅片制造工艺,从而在不断降低成本的同时提供恒定的能力。由于游戏主机系统不像PC那样需要对各个子系统进行扩展和升级,因此其主要内部系统总线往往倾向于定制化而非标准化。
在今天的PC中,GPU通过PCI-Express与CPU连接。早期的几代产品使用的是AGP接口。图形应用程序调用OpenGL(Segal和Akeley,2006)[1]或Direct3D(Microsoft DirectX规范)[2]API函数,将GPU作为协处理器来使用。这些API通过特定于该GPU的图形设备驱动程序向GPU发送命令、程序和数据。
[1]Segal, M. and K. Akeley [2006]. Th e OpenGL Graphics System: A Specifi cation, Version 2.1, Dec. 1, 2006 . www. opengl.org/documentation/specs/ .
[2]Microsoft Corporation. Microsoft DirectX Specifi cation, https://msdn.microsoft .com/en-us/library/
windows/apps/hh452744.aspx .
AGP (Accelerated Graphics Port) 是原始PCI输入输出总线的一个扩展版本,为单个插槽提供了高达原始PCI总线8倍的带宽。其主要目的是将图形子系统连接到PC系统中。
图B.2.4展示了主要的处理阶段,并突出了重要的可编程阶段(顶点着色器、几何着色器和像素着色器阶段)。
图B.2.5展示了由多个独立可编程阶段组成的逻辑管线如何映射到物理分布式的处理器阵列上。
统一GPU架构基于许多可编程处理器的并行阵列。与早期专为每种处理类型设计单独处理器的GPU不同,它们在同一组处理器上统一了顶点、几何和像素着色器处理以及并行计算。可编程处理器阵列与负责纹理过滤、光栅化、光栅操作、抗锯齿、压缩、解压缩、显示、视频解码和高清视频处理等固定功能处理器紧密集成。尽管在受限于面积、成本或功耗预算的绝对性能方面,固定功能处理器明显优于更通用的可编程处理器,但此处我们将重点关注可编程处理器部分。
相比于多核CPU,多核心GPU具有不同的架构设计点,其重点在于高效地在众多处理器核心上执行大量并行线程。通过使用许多更简单的内核,并针对线程组之间的数据并行行为进行优化,芯片上的晶体管预算更多地分配给了计算部分,而较少用于片上缓存和开销。
统一GPU处理器阵列包含许多处理器核心,通常被组织为多线程多处理器。图B.2.6展示了一款拥有112个流处理器(SP)核心的GPU,这些核心被组织成14个多线程流式多处理器(SM)。每个SP核心具有高度多线程性,在硬件中可以管理96个并发线程及其状态。处理器通过一个互连网络连接到四个64位宽的DRAM分区。每个SM包含8个SP核心、两个特殊功能单元(SFU)、指令和常量缓存、一个多线程指令单元以及共享内存。这是NVIDIA GeForce 8800实现的基础Tesla架构。它具有统一架构,其中传统的顶点、几何和像素着色图形程序在统一的SM及其SP核心上运行,而计算程序也在相同的处理器上运行。
处理器阵列架构通过调整多处理器的数量和内存分区的数量,可以实现对更小或更大规模GPU配置的扩展。图B.2.6展示了由两个SM共享一个纹理单元和一个纹理L1缓存的七个cluster。纹理单元根据一组进入纹理贴图的坐标提供过滤后的结果。由于连续纹理请求的滤波区域通常会重叠,因此使用小型流式L1纹理缓存能有效地减少对内存系统的请求次数。
处理器阵列通过整个GPU范围内的互连网络与光栅操作处理器(ROPs)、L2纹理缓存、外部DRAM内存以及系统内存相连。处理器数量和内存数量可以根据不同的性能需求和市场定位设计出平衡的GPU系统。