计算机组成与设计学习——GPU篇(一)

B.1 简介

本内容主要关注GPU(Graphics Processing Unit)——在每台PC、笔记本电脑、台式机和工作站中无所不在的图形处理单元。在最基本的形式上,GPU生成2D和3D图形、图像和视频,使基于窗口的操作系统、图形用户界面、视频游戏、视觉成像应用以及视频成为可能。我们在此描述的现代GPU是一个高度并行、高度多线程的多处理器,专为视觉计算进行了优化。为了通过图形、图像和视频实现实时与计算对象的视觉交互,GPU具有一种统一的图形和计算架构,既可作为可编程图形处理器,又可作为可扩展的并行计算平台。PC和游戏主机将GPU与CPU结合形成异构系统

GPU(Graphics Processing Unit):一种专门为了2D或3D图形、视频、视觉计算和显示的处理器。

视觉计算:一种融合了图形处理与计算技术的混合体,它允许用户通过图形、图像和视频来直观地与计算机生成的对象进行交互。

异构系统:可以简单理解为组合了不同处理器种类的系统。一台PC就是CPU-GPU的异构系统。

GPU(图形处理单元)的演变历史

三十多年前,GPU(图形处理单元)这一概念还不存在。PC上的图形工作是由视频图形阵列(VGA,video graphics array)控制器完成的。VGA控制器实际上就是一个内存控制器和显示生成器,连接到一些DRAM(动态随机存取内存)。到了20世纪90年代,半导体技术取得了足够大的进步,可以向VGA控制器中添加更多的功能。到了1997年,VGA控制器开始集成一些三维(3D)加速功能,包括硬件支持三角形设置与光栅化(将三角形切割成单个像素),以及纹理映射与着色(在像素上应用“贴花”或图案,并混合颜色)。

在2000年,单片图形处理器几乎集成了传统高端工作站图形管线的所有细节,因此,它理应有一个超越VGA控制器的新名称。于是,“GPU”这一术语应运而生,用以表示这种图形设备已经进化为一种处理器。

随着时间的推移,GPU变得越来越可编程化,因为可编程处理器逐渐取代了固定功能专用逻辑,同时保持了基本的3D图形管线结构。此外,计算精度也在不断提升,从索引运算发展到整数和定点运算,再到单精度浮点运算,最近甚至实现了双精度浮点运算。如今的GPU已变成拥有数百个核心和数千个线程的大量并行可编程处理器。

最近,为了支持通用编程语言,处理器指令和内存硬件得到了增强,并且创建了一个编程环境,使得GPU可以使用诸如C和C++等熟悉的语言进行编程。这一创新使GPU成为一款完全通用的、可编程的多核处理器,尽管仍然存在一些特殊的优势和局限性。

GPU图形趋势

GPU及其相关的驱动程序实现了OpenGL和DirectX这两种图形处理模型。OpenGL是一个开放的3D图形编程标准,适用于大多数计算机系统。而DirectX则是微软的一系列多媒体编程接口,其中包括用于3D图形的Direct3D组件。由于这些应用**程序编程接口(APIs)**具有明确的行为定义,因此可以构建对由API定义的图形处理功能的有效硬件加速。

Application Programming Interface(API):一组函数和数据结构定义,提供了一个与函数库进行交互的接口

这是每隔12至18个月就会开发出性能翻倍于上一代的新GPU的原因之一(除了设备密度的增加)。GPU性能的频繁翻倍使得以前无法实现的新应用变得可能。

图形处理与并行计算的交汇催生了一种新的图形学范式,即视觉计算。它用可编程的几何、顶点和像素程序元素取代了传统串行硬件图形管线模型中的大部分部分。在现代GPU中,视觉计算以新颖的方式结合了图形处理和并行计算,允许实现新的图形算法,并为在普及的高性能GPU上开展全新的并行处理应用打开了大门。

异构系统

尽管GPU在普通PC中可以说是并行度最高、功能最强的处理器,但它并非唯一的处理器。CPU如今也已迈入多核时代,作为大规模并行多核GPU的主要辅助性、以串行处理为主的处理器伙伴存在。这两种类型的处理器共同构成了一个异构多处理器系统。

对于许多应用来说,最佳性能往往是通过同时利用CPU和GPU来实现的。重要的是理解如何以及何时在这些日益并行化的两种处理器之间最佳地分配工作,从而最大限度地发挥它们的协同作用。

GPU演变为可扩展并行处理器

GPU在功能上已经从硬连线、功能有限的VGA控制器发展为可编程的并行处理器。这一演变过程是通过改变基于逻辑(API)的图形管线,将其纳入可编程元素,并同时使底层硬件管线阶段变得不再那么专一化、更加可编程来实现的。最终,将分散的可编程管线元素整合成一个统一的多可编程处理器阵列的做法变得合乎逻辑。

在GeForce 8系列GPU时代,几何处理、顶点处理和像素处理全部都在同一类型的处理器上运行。这种统一化带来了显著的可扩展性。更多的可编程处理器核心可以增加整个系统的吞吐量。统一的处理器还能实现非常有效的负载均衡,因为任何处理功能都可以使用整个处理器阵列。另一方面,在处理器数量较少的情况下也能构建处理器阵列,因为所有功能都能在同一组处理器上运行。这样,无论是增加处理器数量以提高性能,还是根据需求配置少量处理器,都体现了GPU作为可扩展并行处理器的发展与进步。

CUDA和GPU计算

这种统一且可扩展的处理器阵列催生了GPU编程的新模型。GPU处理器阵列中大量的浮点运算能力对于解决非图形问题具有极大的吸引力。鉴于在图形应用中处理器阵列展现出的高度并行性和广泛的可扩展性,用于更通用计算的编程模型必须直接表达大规模并行性,并允许进行可扩展执行。

GPU计算是指通过并行编程语言和API利用GPU进行计算,而无需使用传统的图形API和图形管线模型。这与早期的通用GPU计算(GPGPU)方法形成对比,后者是通过图形API和图形管线来编程GPU以执行非图形任务。

GPU计算:通过并行编程语言和API,利用GPU进行计算任务。

GPGPU:通过传统的图形API和流水线,使用GPU进行通用计算。

Compute Unified Device ArchitectureCUDA)是一种为GPU和其他并行处理器设计的可扩展并行编程模型和软件平台,它允许程序员绕过GPU的图形API和图形接口,直接用C或C++进行编程。CUDA编程模型采用了SPMD(单程序多数据)的软件风格,即程序员编写一个适用于单线程的程序,在GPU的多个处理器上实例化并由众多线程并行执行。实际上,CUDA还提供了对多个CPU核心进行编程的功能,因此CUDA是一个针对整个异构计算机系统的并行程序开发环境。

CUDA:一个基于C/C++的可扩展并行编程模型和语言,是一个专为GPU(图形处理器)和多核CPU设计的并行编程平台。

GPU统一图形处理与计算功能

随着CUDA和GPU计算能力的加入,现在可以在同一时间将GPU用作图形处理器和计算处理器,并在视觉计算应用中结合这两种用途。GPU的基础处理器架构通过两种方式展现出来:首先,它实现了可编程图形API;其次,作为一个可通过CUDA以C/C++编程的大规模并行处理器阵列。

尽管GPU底层的处理器是统一的,但并非所有SPMD线程程序都必须相同。GPU可以运行用于图形方面的图形着色器程序,处理几何体、顶点和像素,同时还能运行CUDA中的线程程序。

GPU确实是一种多用途的多处理器架构,支持各种处理任务。由于GPU是专门为图形和视觉计算应用而设计的,因此它们在此领域表现出色。此外,GPU还非常适合许多与图形密切相关的通用吞吐量应用程序,这些应用需要大量并行工作,并具有规律性问题结构。总的来说,GPU对于数据并行问题是一个很好的解决方案,尤其是大型问题,但对于较小且规则性较差的问题则匹配度较低。

GPU视觉计算应用

视觉计算涵盖了传统的图形应用类型以及许多新型应用。最初GPU的适用范围是“任何涉及像素的领域”,但现在,它已经扩展到包括没有像素但具有规律性计算和/或数据结构的许多问题。由于GPU设计的初衷就是用于2D和3D图形处理,因此在这方面表现出色,如果无法满足这类应用性能需求,则会导致其失败。2D和3D图形使用GPU的“图形模式”,通过OpenGL™和DirectX™等图形API访问GPU的处理能力。游戏正是基于3D图形处理能力构建的。

除了2D和3D图形之外,图像处理和视频也是GPU的重要应用场景。这些应用可以通过图形API实现,也可以作为计算程序使用CUDA在GPU的“计算模式”下进行编程。借助CUDA,图像处理可以简化为另一个数据并行数组程序。只要数据访问具有规律性和良好的局部性,程序就能高效运行。实际上,图像处理对于GPU来说是一个非常理想的应用场景。视频处理,尤其是编码和解码(根据某些标准算法进行压缩和解压缩),效率相当高。

GPU视觉计算应用的最大机遇在于“打破图形管线”。早期GPU仅实现了特定的图形API,尽管性能极高,但如果API不支持所需的运算操作,GPU就无法加速任务,因为早期GPU的功能是不可变的。而现在,随着GPU计算和CUDA的出现,可以通过简单编写一个描述所需计算和数据流的CUDA程序,将这些GPU编程来实现不同的虚拟管线。因此,现在所有应用程序都成为可能,这将激发新的视觉计算方法的发展。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值