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

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 为单位。

电源开关上的l1和l2是什么意思 开关单控和双控的区别
电源开关上的L1和L2不是代表火线和零线。严格来说电源开关中的L是代表火线,L1和L2是在双控开关中的两个分别上下连接时的开关火线的组合。
2021-12-24 阅读更多
从电灯开关取电好不好
不推荐从电灯开关上取电,因为电灯开关的安装的导线截面积比较小,一般情况为1mm²,(理论上这种规格铜芯导线可以承载单相交流负载1320W,),它用于灯泡控制是绰绰有余,但从暗
2021-12-24 阅读更多
电线能承载多大电流怎么算
导体都是利用物质最外电子数比较小容易失去电子才称为导体。欧姆定律告诉人们I=U/R(I表示电流用安倍A表示,电压用伏特表示U,电阻用欧姆表示R)和什么叫电阻、电阻率和
2021-12-24 阅读更多
没有地线漏电保护器会跳闸吗
漏电保护器和接地工作原理不同,地线是漏电时外壳就会带电,接地之后设备外壳和大地等电位,把泄漏电流导入大地。而漏电保护器就不同了,它是在设备发生漏电时才动作。人
2021-12-24 阅读更多
灯与插座的零线能用一根线吗
灯与插座的零线能否共用取决于它们是否在一个回路当中。第一、如照明灯和插座是一个回路情况下,可共用一根零线;第二、如不是同一个回路,基本用的都是IP空开,也可共用
2021-12-24 阅读更多
到底什么是短路 短路有什么危害
短路是一个以人的主观意志来定义的物理现象,不能简单的用电流大小或电阻高低来区分。
2021-12-24 阅读更多
电流表校表需要分开两根线吗怎么接线
没有必要分开,但是两根接电流表的线有的必须短接、也有的短接与否均可,要视具体情况而定。
2021-12-24 阅读更多
电工到60周岁上岗合不合法
不合法,因为国家安监局规定超六十周岁不能办电工证了,意思就是电工证的年龄最大不能超过60岁。没有电工证属于无证上岗,安监局没有检查持证上岗还可以过去,但用人单位
2021-12-24 阅读更多
为什么手机用久了电池不耐用了
手机已经成为我们生活中的必需品了,我们在工作和生活中都离不开它,但是我们在慢慢就会发现,手机用了段时间,电池就不经用了,那么到底是手机质量问题还是电池就是这个寿
2021-12-24 阅读更多
空调一般多久清洗一次
空调清洗次数:1、每年夏天消毒清洗一次;2、内机空调的过滤网2个月清洁一次;3、外机散热片可一年清洗一次;4、中央空调外机内部半年清洗一次。
2021-12-24 阅读更多