当前位置:首页 >电工问答

GPU为什么不能完全取代CPU

作者:杨静姿发布时间:2021-05-01 10:14:55

GPU的相比CPU有几个特点

  • 运算资源非常丰富

  • 控制部件占的面积比较小

  • 内存带宽大,目前独显都采用 GDDR5 显存,位宽也高,主流独显内存带宽是CPU的十倍(200GB/s 对比 20GB)

  • 内存延迟高,对比 CPU 使用多级缓存掩盖延迟,GPU 采用多线程掩盖延迟

  • 寄存器资源极为丰富,32bit 寄存器有 64k ,单线程可用 255 个

所以,GPU 只适合处理分支少,数据量大,延迟不敏感的任务。

先看一个GTX 1080 (Compute capability 6.1) 的 SM(stream multiprocessor) 结构

GPU为什么不能完全取代CPU-第1张图片
CC 6.0 SM,来自NVDIA

可以看到,一个 SM 中包含4个 Warp,每个 Warp 含有 32 个 CUDA Core【1】。那么,是不是一个Warp 就相当于 CPU 的 32 核呢?

 

一、 GPU 不适合处理大量分支

我们上面说了,GPU 控制部件面积比较小,为了节约控制器,32 个 CUDA Core 必须时刻执行同样的指令。也就是说,一个 Warp 内部的所有 CUDA Core 的 PC(程序计数器)一直是同步的【2】,但是访存地址是可以不同的,每个核心还可以有自己独立的寄存器组,这种执行方式叫做 SIMT(Single Instruction Multi Trhead)。

这是,你可能会问,如果这一个 Warp 中永远都在执行相同的指令,如果分支了怎么处理呢?

问的好,其实 Warp 中的 CUDA Core 并不是真的永远都执行相同的指令,它还可以不执行啊

GPU为什么不能完全取代CPU-第2张图片
An example of warp divergence(http://15418.courses.cs.cmu.edu/spring2013/article/11)

这样会导致 Warp Divergence(见上图)。如果极端情况下,每一个Core的指令流都不一样,那么甚至还可能导致一个 Warp 中仅有一个 Core 在工作,效率降低为 1/32.

二、GPU 需要数据高度对齐

别看 GPU 一个 Warp 核心这么多,带宽看起来这么大,但是实际上一个一个 Warp 的内存访问是成组的,一次只能读取连续的且对齐的 128byte。【3】(这正好是WarpSize 32 * 4 byte)

GPU为什么不能完全取代CPU-第3张图片
摘自《Professional CUDA Programming》

上图这种操作的效率是最高的。如果访问完全分散,那么效率可能会又变成1/32.如下图。

GPU为什么不能完全取代CPU-第4张图片
摘自《Professional CUDA Programming》

而且 NVIDIA GPU 的缓存策略和 CPU 也不同,没有时间局部性

DIFFERENCE BETWEEN CPU L1 CACHE AND GPU L1 CACHE
The CPU L1 cache is optimized for both spatial and temporal locality. The GPU L1 cache is designed for spatial but not temporal locality. Frequent access to a cached L1 memory location does not increase the probability that the data will stay in cache.
-- 《Professional CUDA Programming》

你可能又会问,CPU 的 Cache line 不也有 64bytes嘛,也就比 GPU 少一半啊,这有什么差别吗?当然有,CPU 是一个核心一个 L1,GPU 是两个 Warp 一个 L1 Cache【4】整个Warp 有一个核心数据没准备好都执行不了。

当然,这么苛刻的访存条件,如果真的做 C = A+ B 还是没什么问题的,现实中访存不会真的这么对齐,所以NVIDIA也下了很多功夫,准备了 Cache 和 Shared Memory, Constant Cache 等部件,力求让程序员能高效访问内存。

三、GPU 访存延迟大

说起来访存延迟和上一节的对齐还是有不少关系,这里分开讲。

你可能还注意到,一个 SM(CC6.1) 最多可同时启动 1024 个线程,但是一个 SM 中仅有 4个 Warp 共计 4 * 32 = 128 个 CUDA Core。显然一个SM可以启动的线程数比 CUDA Core 的数量大好多。这是为什么呢。

我们看下典型的 GPU 访存延迟(《Professional CUDA Programming》数据可能有点老)

10-20 cycles for arithmetic operations 
400-800 cycles for global memory accesses

访存一次能做40个运算啦!但是GPU的显存带宽实际上是非常高的。怎么能让CudaCore 尽量满载呢?这时 SIMT 就上场了。

没关系,这个 Warp (这里指32个线程,之前文中混淆了调度单位和硬件单位)在等数据准备好,我们可以执行另外一组32个线程嘛,这样虽然延迟还是很大,但是 CUDA Core 和 Memory 都能够充分利用。

GPU 的线程切换不同于 CPU,在 CPU 上切换线程需要保存现场,将所有寄存器都存到主存中,而我们最开始说了,一个 SM 中有高达 64k 个 (注意不是64kbytes,有些中文书写错了)4 bytes 寄存器。而每个 Thread 最高使用的寄存器数量为255。少年你发现什么了吗?

256 * 4 * 32 = 32k。也就是说我每个线程把寄存器用到爆,也才用了一半的寄存器,那多出来的这些寄存器是干啥的?

其实,GPU 的线程切换只是切换了寄存器组,延迟超级低,几乎没有成本。考虑到通常线程并不会使用高达255个寄存器,实际上一个 CUDA Core 可以随时在八个线程之间反复横跳,那个线程数据准备好了就执行哪个【5】。这是 GPU 优于 CPU 的地方,也是为了掩盖延迟没办法的事情。

总而言之,GPU 访存还是需要对齐,而且延迟还是很大,但是最大吞吐量(在场景合适的情况下,一个比较长的单位时间,处理的数据量)是远高于 CPU 的。

 

【注1】LD/SD 是存取部件,用来访问显存,SFU 为超越函数单元

【注2】 Volta 架构重大更新,目前允许每个线程有单独PC

【注3】经过 L1 Cache 的数据读取是以 128 byte 为单元,还可以配置为不经过缓存,单元大小为32byte,写入操作单元大小可以为为 32,64,128 bytes,本条说的都是 Global Memory access。

【注4】NVIDIA GPU 的 Cache 最近几代架构变化明显,具体架构请具体分析

【注5】实际上线程切换是以 Warp 为单位。

关于 PLC的常开常闭触点可以随便用吗?
众所周知:低压控制电路中,停止、急停按钮基本都是采用常闭触点。而在PLC控制上,许多同仁不以为然,“反正无论是常开常闭触点都能实现”这一思想往往酿成大的损失.简单
2021-12-24 阅读更多
功率VA和W是什么关系?这么解释应该都懂了!
首先说明一下VA、W和Var不是功率,他们只是功率的单位,分别是视在功率(用S表示)、有功功率(用P表示)和无功功率(用Q表示)的单位。记住是有功无功,不是有用无用!!!他们之间是什
2021-12-24 阅读更多
什么是电压核相?
近期,在110kVBC变电站送电投运工作中,对某地区的电网运行方式进行了适当调整,相关工作中涉及了诸多“电压核相”环节。这个“电压核相”,可能又让我们初涉电力的小白
2021-12-24 阅读更多
变压器铭牌上有哪些主要参数数据?
变压器的铭牌标明该台变压器的性能、技术规格和使用场合,用来满足用户的选用,通常选用注意的主要技术数据有:(1)、额定容量的千伏安数。即额定状态下变压器的输出能
2021-12-24 阅读更多
怎样选择变压器?如何确定变压器的合理容量?
首先要调查用电地方的电源电压,用户的实际用电负荷和所在地方的条件,然后参照变压器铭牌标示的技术数据逐一选择,一般应从变压器容量、电压、电流及环境条件综合考虑
2021-12-24 阅读更多
接地电阻测量原理与测量方法
一、什么是接地电阻?  接地电阻就是电流由接地装置流入大地再经大地流向另一接地体或向远处扩散所遇到的电阻,它包括接地线和接地体本身的电阻、接地体与大地的电
2021-12-24 阅读更多
变压器下为何放鹅卵石?鹅卵石下面又是啥?为什么要有水?
我们经常可以看到,在一些变压器下面放置了大量的鹅卵石,那么这些鹅卵石到底是干什么用的?只是为了美观吗?我们常见的变压器分为干式变压器和油浸式变压器;油浸式变压器
2021-12-24 阅读更多
变压器在运行中有哪些损失?怎样减少损失?
变压器运行中的损失包括两部分:(1)、是由铁芯引起的,当线圈通电后,由于磁力线是交变的,引起铁芯中涡流和磁滞损耗,这种损耗统称铁损。(2)、是线圈自身的电阻引起的,当变
2021-12-24 阅读更多
电动机温度超过多少会烧坏?
一般来说电机绝缘等级如果是A级,环境温度40℃,那么电机的外壳温度应该小于60℃。电机各部位的温度限度1、与绕组接触的铁心温升(温度计法)应不超过所接触的绕组绝缘
2021-12-24 阅读更多
PT断线是什么意思?为什么说PT断线影响很严重?
我们首先了解PT断线是什么。PT是电压互感器的英文符号,电压互感器断线,在电力电气生产活动中是一种比较常见的故障。一旦PT断线失压,对保护、计量、测量等操作的准确
2021-12-24 阅读更多