这就好比F1赛车和重型卡车的区别。一个追求绝对速度,另一个追求最大载重量。如果以每公里时速比,那F1赛车绝对优势,如果以单位油耗载重(或者说单位重量货物运输成本)重卡是绝对优势。两者应用领域不同,设计思路也不同。
这个要从半导体的两个定律开始说起,一个是摩尔定律,另一个是Dennard scaling。摩尔定律说的是工艺改进时单位面积晶体管价格不变,也就是说,每次工艺革新,同样的钱可以买到成倍多的晶体管;Dennard Scaling说的是,工艺革新,单位面积晶体管功耗不变,也就是说晶体管翻倍了,但他们总功耗不变。
这两个定律支撑了过去几十年随工艺革新计算性能成倍提升。有Dennard scaling和摩尔定律,可以通过不断堆晶体管,提升频率提高性能。
后来Dennard Scaling首先失效,也就是说,单位面积晶体管功耗会上升,虽然工艺进步有更多晶体管,但单位面积功耗上升,要维持总功耗不变,必然不是所有晶体管都能同时工作,也就是说虽然晶体管多了,但它们不能同时计算,就是所谓dark silicon,也就是说狂堆晶体管的作用就大打折扣。
堆晶体管依然有用,但是远远不如过去那种成比例提升来得爽。比方说,我可以用更多的晶体管来提升执行效率,比方说乱序执行,然后通过降电压,降频控制功耗。再或者就是粗放型的堆多核,这样因为峰值性能提升,也可以降压降频控制功耗。
扯了那么多,还没回答问题。回到正题,在给定功耗和晶体管的约束下,就在于如何分配晶体管给计算或者控制逻辑。GPU侧重浮点计算,晶体管和功耗主要向浮点计算倾斜;CPU侧重控制流,和降低延迟,晶体管和功耗侧重优化延迟。
CPU注重单线程性能,也就是低延迟,那么对CPU来讲,需要保证指令流不中断,消灭流水线中的气泡,于是CPU需要消耗更多的晶体管和功耗在控制部分,包括:指令多发射,分支预测,乱序执行等等,其中reorder buffer是耗电大户,于是CPU能分配在浮点计算上的功耗就会少,因为很大一部分功耗被分配在控制部分,如下示意图(不是真实面积比例):
GPU不同是,注重吞吐量,单指令能驱动更多计算,比如一条指令驱动三十二路浮点计算,于是相比较而言GPU消耗在控制部分功耗相对较少,由于GPU注重吞吐量,所以GPU也不需要复杂的分支预测,乱序执行之类,也进一步把电省下来给浮点运算。
所以,他们的不同只是在于如何去分配晶体管和功耗完成不同的工作,侧重点不同。不同的应用特征不同,需要不同的架构,像操作系统这一类,需要快速响应实时信息,需要针对延迟优化,于是晶体管资源都要用在控制部分,分支预测,乱序执行上,低延迟缓存。而像矩阵运算一类,程序具有极高的可预测性和大量相似的运算,那些针对单线程优化的策略反而是累赘,比如低延迟缓存通常更昂贵、reorder buffer占用大量晶体管和耗电。这类应用就非常适合GPU,这种高延迟高吞吐的架构。
最后,摩尔定律接下来也会失效,这时候,针对应用的优化就会变得越来越重要,也就是说需要软件硬件从上到下的完全协同设计。所以像苹果那样从软件到硬件全部自己做也是有道理的。
楼上所有的回答只有
@王洋子豪的回答提到的关键点,他的回答信息很多,大家都没有理解到。
首先说GPU比CPU快,需要有个归一化的标准,不能拿着100美元功耗80瓦的CPU和2000美元功耗300瓦的GPU比,这肯定不公平,也不能CPU上的单线程和GPU的多线程比较,这都不公平。归一化的标准用什么呢?用价格肯定不是很合理,毕竟影响价格的因素太多。考虑现在计算机的瓶颈 power wall,用功率来归一化是最合理的。现在的情况是,在归一化到功率,即每瓦特的情况下,GPU的运算的能力也比CPU也要好,我们应该讨论的是,为什么GPU的power efficiency要CPU要高?或者说为什么CPU的效率低于GPU,CPU的效率被“浪费”到什么地方去了?回答很简单,重要的事情说三遍:
缓存,缓存,缓存
CPU有大量的缓存结构,现在流行的PC芯片上都有四级缓存,这些缓存结构消耗了大量的晶体管,在运行的时候,自然要消耗大量的电力。但是GPU的缓存很简单,现在最多有两层,而CPU消耗在晶体管上的费用和能耗,GPU都可以用来做成ALU单元,这就是GPU比CPU效率高的根本原因。
为什么GPU可以这么设计但是CPU不行?这是因为任务不一样的原因。对CPU来说,要求的是实时响应,对单任务的速度要求很高,所以就要用很多层缓存的办法来保证单任务的高速度。而对GPU来说,大部分任务的性质都是看“那个部分最后一个完成”,比如说,对GPU做显卡来说,没有人关心显示器上的第一个像素什么计算完成,大家都只关心什么时候把显示器上的最后一个像素算出来,对深度学习了,没人关系第一个参数算出来,都关系什么时候做完最后一个,所以GPU可以把所有的任务都排好,对缓存就的要求就很低。对CPU来说,比如处理点鼠标这种任务,要求的是点第一下时候就能及时响应,如果电脑说,等你点100下鼠标,我来批量处理,效率能提高一倍,你回作何感想。