密集计算下CPU vs GPU

做人脸检索的时候,40多核的cpu,如果配置不够负责人说要加GPU阵列。为什么加GPU而不是CPU?

自己一开始想是性价比问题,难道GPU的工艺要求低,比CPU便宜,那么为什么不一开始就用GPU呢。查了下,解释起来并不复杂。而且在大学的时候汇编原理上也学过。最主要原因是CPU和GPU定位不同,职责不同,导致设计上结构不同,从而导致功能不同。

CPU不仅是计算还有控制,硬件资源比较平均地分给了加减法、乘法、寻址、寄存器、微指令等组件。而GPU大多是计算。知乎上看到的一个比喻很形象,CPU像是一个老教授,微积分,麦克斯韦方程解起来很easy,而且还担任很多行政职务,而GPU是很多小学生,算加减乘除很在行。当要计算1w个乘法的时候,老教授可能就不如一群小学生了。

有必要加强CPU的浮点运算能力?

既然CPU计算不行(与GPU相比)为什么不增加这方便的能力?主要还是因为分工问题。作为一个处理器来讲,大多数面对的场景不是密集计算的,可以加,但是价钱肯定上来了,而且从性价比上考虑肯定不如一般CPU+GPU方式。从设计角度上讲,分工才能更专业,更加灵活。

所以,大数据量计算使用GPU不是什么奇淫技巧,而是一个合理的,理所当然的方案。

GPU有什么要计算的?

一般所说的硬件加速,其实就是用GPU代替CPU进行一些计算。Android手机上很多应用也支持硬件加速,Google的流量器也支持硬件加速。

至于GPU有什么要计算的,最典型的有两个场景。

一是3D游戏,游戏中为了显示更加真实,渲染显示都是实时计算的,如一个3d的人物在地图上移动,不是简单图形叠加,需要计算每个像素点下次应该在哪里显示,因为还有转身转身又有很多角度的问题。所以说你在王者峡谷上上每转个身,向前走两步,都是手机GPU在疯狂计算的结果。

另外一个就是视频解码,高清视频1080p体积其实是很大的,看看手机上录制视频就知道了,但是在网上看也是高清视频带宽就4兆为什么还这么流畅么?其实是算法压缩过的,4M的码流解压开可能有几十兆大小,而这个过程可以用GPU完成。

CPU与GPU结构

CPU结构图,控制与数据流还是比较复杂,图来自wiki

Block diagram of a basic uniprocessor-CPU computer. Black lines indicate data flow, whereas red lines indicate control flow; arrows indicate flow directions.

CPU与GPU对比

其中绿色的是计算单元,橙红色的是存储单元,橙黄色的是控制单元。

GPU采用了数量众多的计算单元和超长的流水线,但只有非常简单的控制逻辑并省去了Cache。而CPU不仅被Cache占据了大量空间,而且还有有复杂的控制逻辑和诸多优化电路,相比之下计算能力只是CPU很小的一部分

#CPU与GPU的设计理念低延迟vs高吞吐 低延迟与高吞吐在性能测试上也经常提到,不能只看一方面。CPU设计考虑是低延迟,而GPU设计初衷是高吞吐量。

一般而言,高吞吐量意味着高的并发,比如Kafka的设计,多个producer能并发同时向多个broker去写。还有数据结构LinkedBlockingQueue能在头尾有两个锁相比ArrayBlockingQueue虽然延迟高,但吞吐量大。GPU与CPU比,有很多的ALU(就像kafka有多个broker,LinkedBlockingQueue有头尾两个锁),更多的执行线程。

CPU与GPU实际中比例如何配置?

Google暂时没有找到生产环境中实际的配置。目前自己理解,在密集计算场景下CPU与GPU的比例1:2或者1:4都可以。像只有40几个核心的CPU没有GPU的配置还是有点浪费。

参考

CPU 和 GPU 的区别是什么?

Table of Contents