找回密码
 立即注册
查看: 227|回复: 0

通用图形处理器架构 #1 GPGPU概述

[复制链接]
发表于 2022-6-20 10:23 | 显示全部楼层 |阅读模式
计算加速器概述

多年以来,单位成本下的计算能力呈指数级上升,这是由于晶体管的尺寸缩小、硬件架构的改善、编译器技术的发展以及算法进步带来的综合效果。有一些学者认为一半的性能提升都来自晶体管尺寸缩小使得硬件的计算加快,但是自2005年以来,晶体管的规模增长由于Dennard Scaling失效而停滞不前。一个重要因素是时钟频率的改善相比以前要小得多,为了解决这个问题人们不得不寻找更高效的硬件架构。
通过使硬件更具有针对性,让我们可能取得最高500倍的能源效率改进。我们有多种关键因素来获得更高的效率:使用向量处理单元,例如GPU,通过减少指令处理的消耗获得十倍左右的效率提升;减少数据移动,通过引入对数据的复杂操作提高计算强度,增加计算访寸比来减少访寸开销。
当今计算体系结构的一个重要挑战是在使用专用硬件的效率提升和对广泛程序提供灵活性之间达到平衡。在剥离架构的影响后,只有通用算法(适用于大多数软件)才能被广泛应用。一个很显然的例子是Google推出的Tensor处理单元TPU,这种处理单元专用与深度神经网络。虽然机器学习似乎有可能占据很大一部分计算硬件资源,而且这些资源可能会迁移到专门的硬件上,但我们认为,仍然需要支持那些使用传统编程语言编写的软件。
当今人们使用GPU的一大兴趣是在使用GPU进行机器学习任务之外,GPU还支持图灵完备的编程模型。图灵完备性是指任何计算可以在无限的时间以及无限的存储内完成,相对于专用加速器,现代GPU是灵活的。对于可以完全利用GPU硬件的软件来说,GPU比CPU的效率高很多。这种对灵活性以及效率的提升是所有人都希望得到的,因此在很多超级计算机上,峰值性能的提高以及能源效率的提升都是使用GPU带来的效果。概览GPU产品的发展,GPU制造商以及重新定义了GPU架构和编程模型来增加能源效率以及灵活性。
GPU的硬件基础

在第一次接触到GPU,人们常常会问到他们是否会完全替代CPU?这看起来是不可能的,在现有的系统中GPU并不是一个可以独立使用的计算设备,而是被集成在CPU中或以一个外接设备存在的。CPU主要负责在GPU上启动过计算以及向GPU拷贝数据,并将结果拷贝回主机。如此区分CPU和GPU功能的一个原因是在计算启动和结束的时候通常都需要访问I/O设备,虽然目前正在努力开发直接在GPU上提供I/O服务的应用编程接口(API),但到目前为止,这些程序在编写时都是假设附近存在一个CPU来完成I/O操作。这些API通过隐藏CPU和GPU间复杂的通讯过程来提供一个简单的接口,而不是力图完全消除CPU存在的必要性。我们为什么还要使用CPU?用于访问I/O设备和以其他方式提供操作系统服务的软件似乎缺乏一些特征,如大规模的并行性,并行性将使这些程序适合在GPU上运行(也就是说我们必须将这些不具有并行性的软件运行在CPU上),因此我们一开始就需要考虑CPU和GPU的交互使用。
一个GPU计算应用通常在CPU上启动,CPU将会负责分配初始化一些数据结构。在一些较老的英伟达和AMD的GPU上,CPU需要在CPU和GPU两个设备上分配空间。对于这些GPU,CPU上运行的软件必须负责将数据从CPU的内存搬运到GPU的内存中。一些更新的GPU架构如英伟达的Pascal架构,拥有一些软件和硬件支持可以自动的将数据从CPU内存空间转移到GPU的内存空间。这个功能可以使用在CPU和GPU上的虚拟内存实现,英伟达称之为“统一内存”。在系统中CPU和GPU被集成在一个芯片中并且共享相同的内存空间,程序员不需要控制从CPU内存拷贝数据到GPU内存。但是由于CPU和GPU都需要使用cache,并且一些cache是私有的,这就有可能造成缓存一致性问题,这需要硬件程序员去解决。
一般来说,CPU需要在GPU上启动一个计算过程。在当前的系统中这个过程是由一个运行在CPU中的驱动帮助完成的。在启动GPU计算之前,程序代码需要指明哪一些代码需要运行在GPU上,这些代码通常被称之为Kernel。同时CPU上运行的部分还要指定在GPU上运行多少线程,以及输入数据的存放位置。当kernel被启动后,线程数量和输入数据的位置通过驱动程序被发送到GPU。驱动将会将这些信息进行转换并将其放在GPU配置的特定区域方便GPU查找。然后驱动会告诉GPU有一个新的计算任务需要运行。
计算单元
现代GPU拥有一个类似“众核”的架构,英伟达称这些核心为流多处理器核心(SM),AMD称之为计算单元。每一个SM核心执行一个由对应kernel发起的SIMT程序,每一个SM核心通常可以运行多个线程。这些运行在同一个GPU核心的线程可以通过scratchpad内存进行通信,也可以通过barrier操作进行同步。每一个核心通常都具有一级指令和数据缓存。这些带宽过滤器可以减少发送给较低存储层次的数据量,大量的的线程可以被用来隐藏由于cache miss导致的延迟。
存储系统
为了获得高吞吐量就需要平衡高吞吐和高带宽,这就对存储系统提出了并行化的要求。在GPU中这种访寸的并行性是通过多个内存通道实现的。一般来说每个内存通道对应的内存分区被组织为最后一级缓存的一部分,GPU核心和一部分内存通过片上互联网络连接。当然其他的组织结构也是存在的,例如Intel Xeon Phi将最后一层缓存与计算核心直接集成在一起。
与传统CPU的对比
与超标量乱序CPU相比,通过减少用于控制逻辑的面积并增加算术逻辑单元的面积,GPU可以在高度并行的工作负载上获得更好的单位面积性能。为了进一步探索CPU与GPU架构之间的tradeoff,Guz等人开发了一个非常有用的分析模型,显示了随着线程数量增加系统性能的变化。为了保持模型的简洁,Guz等人假设了一个非常简单的缓存模型,在这个模型下线程之间不存在数据共享并且拥有无限大的内存带宽。下图显示了一个非常有意思的trade-off,当一个非常大的cache被较少的线程共享时,性能随着线程数量线性增长。但是当线程增长到一定数量时,cache装不下整个workload,性能就会出现下降。当线程继续增长,系统可以通过线程切换来隐藏由于cache miss造成的延迟,从而获得了更高的性能。GPU架构被现实在图片的右手边,GPU就是被设计为通过大量的线程来隐藏访存延迟。


随着Dennard Scaling的实效,增加芯片的能源效率成为芯片架构革新的主要动力。一个重要的发现是大量的访存会消耗比计算更多的能量。例如下表提供了在45nm芯片上部分操作所消耗的能量。在设计新的GPU架构时,我们都需要考虑的能耗问题,为了帮助解决这个问题,现在的模拟器上都加入了能源消耗因素。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-26 10:41 , Processed in 0.094997 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表