CPU和GPU之因此大不相同,是因为其设计目标的不一样,它们分别针对了两种不一样的应用场景。CPU须要很强的通用性来处理各类不一样的数据类型,同时又要逻辑判断又会引入大量的分支跳转和中断的处理。这些都使得CPU的内部结构异常复杂。而GPU面对的则是类型高度统一的、相互无依赖的大规模数据和不须要被打断的纯净的计算环境。html
因而CPU和GPU就呈现出很是不一样的架构(示意图):缓存
图片来自nVidia CUDA文档。其中绿色的是计算单元,橙红色的是存储单元,橙黄色的是控制单元。多线程
GPU采用了数量众多的计算单元和超长的流水线,但只有很是简单的控制逻辑并省去了Cache。而CPU不只被Cache占据了大量空间,并且还有有复杂的控制逻辑和诸多优化电路,相比之下计算能力只是CPU很小的一部分架构
从上图能够看出:并发
Cache, local memory: CPU > GPU 优化
Threads(线程数): GPU > CPUspa
Registers: GPU > CPU 多寄存器能够支持很是多的Thread,thread须要用到register,thread数目大,register也必须得跟着很大才行。线程
SIMD Unit(单指令多数据流,以同步方式,在同一时间内执行同一条指令): GPU > CPU。 设计
CPU 基于低延时的设计:htm
CPU有强大的ALU(算术运算单元),它能够在不多的时钟周期内完成算术计算。
当今的CPU能够达到64bit 双精度。执行双精度浮点源算的加法和乘法只须要1~3个时钟周期。
CPU的时钟周期的频率是很是高的,达到1.532~3gigahertz(千兆HZ, 10的9次方).
大的缓存也能够下降延时。保存不少的数据放在缓存里面,当须要访问的这些数据,只要在以前访问过的,现在直接在缓存里面取便可。
复杂的逻辑控制单元。当程序含有多个分支的时候,它经过提供分支预测的能力来下降延时。
数据转发。 当一些指令依赖前面的指令结果时,数据转发的逻辑控制单元决定这些指令在pipeline中的位置而且尽量快的转发一个指令的结果给后续的指令。这些动做须要不少的对比电路单元和转发电路单元。
GPU是基于大的吞吐量设计。
GPU的特色是有不少的ALU和不多的cache. 缓存的目的不是保存后面须要访问的数据的,这点和CPU不一样,而是为thread提升服务的。若是有不少线程须要访问同一个相同的数据,缓存会合并这些访问,而后再去访问dram(由于须要访问的数据保存在dram中而不是cache里面),获取数据后cache会转发这个数据给对应的线程,这个时候是数据转发的角色。可是因为须要访问dram,天然会带来延时的问题。
GPU的控制单元(左边黄色区域块)能够把多个的访问合并成少的访问。
GPU的虽然有dram延时,却有很是多的ALU和很是多的thread. 为啦平衡内存延时的问题,咱们能够中充分利用多的ALU的特性达到一个很是大的吞吐量的效果。尽量多的分配多的Threads.一般来看GPU ALU会有很是重的pipeline就是由于这样。
因此与CPU擅长逻辑控制,串行的运算。和通用类型数据运算不一样,GPU擅长的是大规模并发计算,这也正是密码破解等所须要的。因此GPU除了图像处理,也愈来愈多的参与到计算当中来。
GPU的工做大部分就是这样,计算量大,但没什么技术含量,并且要重复不少不少次。就像你有个工做须要算几亿次一百之内加减乘除同样,最好的办法就是雇上几十个小学生一块儿算,一人算一部分,反正这些计算也没什么技术含量,纯粹体力活而已。而CPU就像老教授,积分微分都会算,就是工资高,一个老教授资顶二十个小学生,你要是富士康你雇哪一个?GPU就是这样,用不少简单的计算单元去完成大量的计算任务,纯粹的人海战术。这种策略基于一个前提,就是小学生A和小学生B的工做没有什么依赖性,是互相独立的。不少涉及到大量计算的问题基本都有这种特性,好比你说的破解密码,挖矿和不少图形学的计算。这些计算能够分解为多个相同的简单小任务,每一个任务就能够分给一个小学生去作。但还有一些任务涉及到“流”的问题。好比你去相亲,双方看着顺眼才能继续发展。总不能你这边还没见面呢,那边找人把证都给领了。这种比较复杂的问题都是CPU来作的。
总而言之,CPU和GPU由于最初用来处理的任务就不一样,因此设计上有不小的区别。而某些任务和GPU最初用来解决的问题比较类似,因此用GPU来算了。GPU的运算速度取决于雇了多少小学生,CPU的运算速度取决于请了多么厉害的教授。教授处理复杂任务的能力是碾压小学生的,可是对于没那么复杂的任务,仍是顶不住人多。固然如今的GPU也能作一些稍微复杂的工做了,至关于升级成初中生高中生的水平。但还须要CPU来把数据喂到嘴边才能开始干活,究竟仍是靠CPU来管的。
什么类型的程序适合在GPU上运行?
(1)计算密集型的程序。所谓计算密集型(Compute-intensive)的程序,就是其大部分运行时间花在了寄存器运算上,寄存器的速度和处理器的速度至关,从寄存器读写数据几乎没有延时。能够作一下对比,读内存的延迟大概是几百个时钟周期;读硬盘的速度就不说了,即使是SSD, 也实在是太慢了。
(2)易于并行的程序。GPU实际上是一种SIMD(Single Instruction Multiple Data)架构, 他有成百上千个核,每个核在同一时间最好能作一样的事情。