GPU体系架构概述

最近正在学习CUDA,这篇文章是对于GPU体系架构的笔记,参考了中科大的CUDA网课。总结如有错误或疏漏,欢迎各位指出。


1.为什么需要GPU呢?

  • 在现代社会中,我们对于应用的需求越来越高,而计算机技术又是由应用进行驱动(Application Driven),我们急需强大的处理信息(计算)能力。由于这种对于计算能力的强烈需求,GPU应运而生。

  • GPU(Graphic Processing Unit)是一个异构的多处理器芯片,为图形图像处理进行优化。实际上GPU和CPU只是优化的内容不同,本质上完成的工作还是一样的。

  • 从下图图中可以看到,NVIDIA的GPU自从诞生起,浮点运算能力就发展极其迅速。

(FLOP:每秒进行浮点运算的次数)

2.CPU与GPU(提升运算速度三种方法)

  • GPU中有很多执行单元,我们可以将每个执行单元理解成一个完整的小的处理器。每个执行单元有自己的取址译码单元(Fetch/Decode)、算术逻辑单元(ALU)、执行上下文(Execution Context)。

  • 我们再来看看CPU的内核。你会发现除了处理指令的单元外,还有一部分单元并不负责处理指令。这一部分包括缓存(Cache),还有图里没有显示的分支预测、OoO控制逻辑等单元。它们是用于增加处理效率的,并且占了整个CPU绝大多数的面积和成本。你可以理解为一个公司里有极为复杂的管理机构,实际干活的人却很少。而正是因为管理机构很复杂,CPU可以把事情干的非常漂亮。

  • 那么如何从CPU的架构变成GPU的架构呢?我们可以通过以下三种方法,让一颗CPU风格的处理器增加运算能力,变成GPU风格的处理器。

(1)精简、减肥

  • 精简掉那些设计目的是为了提高处理效率却很消耗资源的那一部分,只留下最核心的部件(GPU core),即“取址、运算、执行上下文”。如下图。

  • 精简掉的那些面积,可以用来多放这样的几组核心部件。可以理解为一家公司把行政机构裁减了,增加了几个干活的人。比如如果多放一个core,就会是2个核,那么就可以同时执行2个独立的程序片元(就是程序段)。当然也可以4核、16核......

  • 程序片元一般共享相同的指令流,这是为了避免复杂的控制机构。当然也可以不同,但是控制机构就会复杂。

(2)增加ALU

  • 增加了ALU宽度,让一个核的内部有多ALU,这样就可以进行SIMD(单指令多数据)的处理,比如向量的处理。假如一个GPU芯片有16个核,每个核里放8个ALU,那么就可以同时128个程序片元,并发16路指令流。

  • 在一个核内,不同的ALU处理不同的数据(SIMD),在分支结构中,ALU会执行同一个指令中不同的分支语句,由于一个核中只有一个取址单元,因此其他分支的ALU只有等到正在处理的分支处理完毕才能开始执行指令,并且他们不能做别的工作。比如一个核内8个ALU,3个是true,在执行true的时候,剩下5个只能等到true执行完了才能开始执行false。因此可以看出,不是所有的ALU都在做有用的工作。最糟糕的情况下,只有一个ALU在做有用的事情,即此时此刻只有1/8峰值性能。

  • SIMD处理并不一定需要显式的SIMD指令,底层的硬件是可以自动的把一些标量的指令变成SIMD的。

(3)通过片元切换来掩藏延迟

  • 处理程序的时候是会遇到停滞的,比如数据还没来,环境没有准备好等情况。数据处理是很快的,但是等数据会很缓慢。由于停滞会大幅度降低效率,因此要想办法把这种延迟掩藏过去。

  • 应对思路很简单,要使用大量的片元进行切换。可以理解成给一个人大量的相互无关的活,没准备好可以做别的活,比如扫帚没到不能扫地,那就去搬箱子,直到扫帚到了再说,让这个人一直在干活,不能闲着。

  • 执行上下文(Execution Context)就一个存储空间,用来处理数据和指令的空间。这些上下文也可以进行分割。分割出来的上下文越多,比如分成18个小的上下文,延迟掩藏效果越好,但是每个上下文存储的东西就少。分的越少,比如分成4个上下文,延迟掩藏的效果就越差,但是每个上下文存储的东西就多。

  • 不同的上下文进行切换不止可以软件管理,也可以硬件管理。NVIDIA的GPU往往是硬件管理。

  • 举个例子,比如下图这个芯片:

一块芯片,16个核,每个核8个ALU,总共128个ALU,理论上可以同时计算128组数据。16个核可以承载16个指令流,每个核有4个上下文存储空间,就有64路同时加载到芯片上的指令流(同时执行的只能是16路,加载上去可以调度的是64路)。整个芯片可以加载上去512个程序片元(16核*8ALU*4上下文)。如果每个ALU的主频是1GHz的话,那么这个256GFLOPs的峰值处理能力。

CUDA编程中称核为SM(Streaming Multiprocessor),称ALU为CUDA核(CUDA core),称程序片元为CUDA线程(CUDA threads)。

3.存储和数据访问问题(访存问题)

  • CPU里有很大的缓存,很大的一部分面积都是用于缓存。而GPU将大量面积用于ALU,而存储器(显存)放在了外面。

  • 访存带宽是非常宝贵的资源!!虽然GPU计算能力极强,但是如果带宽不够,访存能力有限,那么数据过不来,GPU效率就会低。因此为GPU设计了很大的带宽(150GB/s),但其实仍然不能完全匹配GPU的处理能力。因此很多的计算效率不高的原因都是因为带宽首先导致的。

  • 减少带宽需求的方法是减少不必要数据的请求(通过计算解决),以及打包零散数据减少取址次数是减少带宽需求的好方法。

  • 总结:GPU是异构、众核的处理器,针对的是吞吐优化。高效的GPU任务应该具有成千上万的独立工作(利用大量ALU、有大量片元切换掩藏延迟)、可以共享指令流(适合SIMD)、最好是计算密集的任务(通信与计算开销比例合适、不受限于方访存带宽)。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值