听到GPU,多数人肯定会联想的CPU,那里还是单核的时代,每条指令都是顺序执行。相比CPU,很多人可能听说过一个比喻:GPU是一群小学生,扎堆算加减法;CPU是一个老教授,能解微积分。
先上一张老生常谈的图吧,说起这个问题需要长篇大论解释CPU和GPU本身区别或者GPU浮点为什么比CPU高?
那么,先抛一个简单明了的答案:CPU和GPU本身设计方式和运算目的不同导致了这种差距,那么我来细说一下。
CPU和GPU设计上大概有什么不同:
1:CPU中大部分(大概70%)晶体管用来构建Cache还有一部分控制单元,负责逻辑算数的部分并不多;而GPU整个就是一个庞大的计算阵列(包括alu和shader填充),我们知道GPU大致分为3d setup和流计算两个部分,而GPGPU就是用流计算来做大量密集型运算,比如linpack这种求解大规模稠密线性方程组。GPU中负责逻辑算数的部分要远远大于CPU因此在逻辑运算上当然就比CPU强太多
2:GPU对Cache的依赖比CPU小,因为GPU用的是高速度总线;其次GPU的数据具有高度对齐性以及不符合局部化假设、比CPU更深的pipeline执行还有一点就是很少把数据写回。
但是CPU不同,它非常需要Cache,有无Cache的CPU差距可以是极大的。其实Cache是人类如今对于硅工艺的一种“妥协”——我们总是希望拥有一个存储器它的CPU比肩或者接近于CPU同时又可以在容量上做大。但目前硅工艺限制了这个“天马行空”的幻想,因此,人类不得已做出了Cache这个片上存储器,它的速度的确是最快的,位于存储器体系结构的最高层,但它也是容量最小的。它可以扩大,但是进步很小,至于原因其中大概是2点:1:Cache是构建于CPU内部,需要考虑面积;2:需要权衡利弊,比如l1不能无限做大是因为本身致力于为CPU提供一个快速的数据递交,而l1如果做大那么命中时间增加以及延迟开销的影响来说这就是非常大的弊端了。
为什么CPU需求Cache?上面说的已经透露了一些,CPU需要处理不同类型的数据更是需要存储器的配合来执行load/store指令,所以,我们通过在CPU内部构建一个Cache作为片上存储器配合DRAM、ROM整个存储器体系结构为配合CPU处理load/store指令;还有一点是CPU的总线速度非常落后。
3:还有一点就是核心的不同。CPU的核心内部因为有大量Cache所以一个逻辑核心普遍是比GPU中的Stream Processors大的,GPU中的SP就是简单的核心但是CPU不同,在core的设计上CPU是比GPU复杂的多。
CPU和GPU计算目的的不同:
1:如上就可以看出来。CPU本身设计初衷适合串行,而GPU则是适合大规模并行。CPU所作的工作是极度复杂的,处理的指令之间有复杂的逻辑关系,比如Dependence还有branch Instruction等等,这些都是GPU做不来的。
2:GPU需要做的工作在复杂度上远不如CPU,GPU需要处理的数据之间没有任何的Dependence,所以它们可以并行执行,比如Vertex和Pixel两种数据处理都运行独立数据产生独立结果因此可以达到高度并行。换句话来说,GPU因为设计问题天生适合大规模SIMT/SIMD运算方式。它就是一个针对向量计算进行高度并行并且以数据流作为处理单元的处理机这样在对数据流的处理上可以获得很高的效率。
如上是大致说出了GPU比CPU在alu计算上的关键所在,那么我前面说过了,GPU主要是两部分:一部分是3d setup;一部分是负责密集型流计算的。后者是属于可编程的,那么GPGPU正是利用OpenCL、CUDA这些专用非图形接口API让流计算的部分来解决非图形问题,比如流体模拟、爆炸等等这些适合大规模密集型运算的工作。
如上,在GPU通用计算上GPU比CPU强的原因无外乎就是:因为根本目的的不同产生了不同设计因而导致各自计算方向不同所以产生了这样的差距。