为什么我们还在用CPU而不是GPU?
在我看来,现在很多计算都是在GPU上完成的。显然,图形处理是在那里完成的,但使用CUDA之类的东西,AI、散列算法(认为比特币)等也是在GPU上完成的。为什么不能摆脱CPU,自己用GPU来做呢?是什么原因让GPU比CPU快那么多?
TL;DR答案: GPU的处理器核心数量远多于CPU,但由于每个GPU核心的运行速度明显比CPU核心要慢,而且不具备现代操作系统所需的功能,因此不适合执行日常计算中的大部分处理工作。它们最适合于计算密集型操作,如视频处理和物理模拟等。
GPGPGPU还是一个比较新的概念。GPU最初只用于渲染图形;随着技术的发展,GPU相对于CPU而言,GPU中的大量内核被利用起来,开发出了GPU的计算能力,使其可以同时处理许多并行数据流,无论这些数据是什么数据。虽然GPU可以拥有数百个甚至数千个流处理器,但它们每个流处理器的运行速度都比CPU内核慢,而且功能也较少(即使它们是图灵完全,并且可以被编程为运行CPU可以运行的任何程序)。GPU缺少的功能包括中断和虚拟内存,这都是实现现代操作系统所需要的。
换句话说,CPU和GPU有明显不同的架构,使它们更适合于不同的任务。GPU可以处理许多数据流中的大量数据,对这些数据流执行相对简单的操作,但不适合在单一或少数数据流上进行繁重或复杂的处理。而CPU在单位核的基础上(以每秒的指令计算)速度要快得多,可以更容易地在单一或少数数据流上执行复杂的操作,但不能有效地同时处理许多数据流。
因此,GPU不适合处理那些没有明显好处或不能并行化的任务,包括许多常见的消费类应用,如文字处理器等。此外,GPU使用的是一种根本不同的架构;人们必须专门为GPU编程,才能使其工作,而对GPU编程则需要明显不同的技术。这些不同的技术包括新的编程语言,对现有语言的修改,以及新的编程范式,这些范式更适合将计算表达为由许多流处理器执行的并行操作。关于GPU编程所需的技术的更多信息,请参阅维基百科上的文章流处理和并行计算。CUDA和OpenCL等框架使程序可以为GPU编写,GPU的特性使其最适合于高度并行化的操作,例如在科学计算中,一系列专门的GPU计算卡可以替代小型计算集群,如NVIDIA Tesla个人超级计算机。拥有现代GPU的用户如果对Folding@home有经验,可以用它们来为GPU客户端做贡献,它可以以非常高的速度执行蛋白质折叠模拟,并为项目贡献更多的工作(一定要先阅读FAQs,特别是与GPU相关的内容)。GPU还可以在视频游戏中使用PhysX实现更好的物理模拟,加速视频编码和解码,并执行其他计算密集型任务。正是这些类型的任务是GPU最适合执行的。
AMD正在开创一种名为加速处理单元(APU)的处理器设计,它将传统的x86 CPU内核与GPU相结合。这种方法使图形性能远远优于主板集成的图形解决方案(尽管无法与更昂贵的独立GPU相比),并允许在不需要单独的GPU的情况下,实现紧凑、低成本的系统,并具有良好的多媒体性能。最新的英特尔处理器也提供了片上集成图形处理器,尽管目前具有竞争力的集成GPU性能仅局限于搭载英特尔Iris Pro Graphics的少数芯片。随着技术的不断进步,我们将看到这些曾经分离的部分越来越趋于融合。AMD的设想是未来,CPU和GPU将合二为一,能够在同一个任务上无缝地协同工作。由于现有的许多软件都使用x86架构,而且由于GPU需要不同的编程技术,并且缺少操作系统所需的几个重要功能,因此在日常计算中,从CPU到GPU的一般过渡是非常困难的。
是什么原因让GPU比CPU快那么多?
GPU是不比CPU快。CPU和GPU是为了两个不同的目标而设计的,有不同的权衡,所以它们有不同的性能特性。某些任务在CPU中计算速度更快,而其他任务在GPU中计算速度更快。CPU 擅长对小的数据集进行复杂的操作,GPU 擅长对大的数据集进行简单的操作。
GPU 是一种特殊用途的 CPU,它的设计是让一条指令在一个大的数据块(SIMD/Single Instruction Multiple Data)上工作,所有的指令都应用相同的操作。在数据块中工作当然比在单个数据块中工作更有效率,因为解码指令的开销大大减少,但是在大数据块中工作意味着有更多的并行工作单元,所以它需要使用更多的晶体管来执行一条GPU指令(造成物理尺寸的限制,使用更多的能量,产生更多的热量)。由于它只需要在单一基准上工作,所以执行一条指令所需的晶体管数量要少得多,因此CPU可以承受更大的指令集、更复杂的ALU、更好的分支预测、更好的虚拟化架构和更复杂的缓存/管道方案。它的指令周期也更快。
我们之所以还在使用CPU,****不是因为x86是CPU架构的王者,Windows是为x86编写的,我们之所以还在使用CPU,是因为操作系统需要做的那种任务,也就是做决策,在CPU架构上运行效率更高。一个操作系统需要看100多个不同类型的数据,并做出各种决策,而这些决策都是相互依赖的;这种工作并不容易并行化,至少不会变成SIMD架构。
在未来,我们会看到的是CPU和GPU架构之间的融合,因为CPU获得了在数据块上工作的能力,比如SSE。同时,随着制造技术的提高和芯片的体积越来越小,GPU也能承受更复杂的指令。
GPU缺乏:
你需要这些东西才能实现像现代操作系统一样的东西。
它们在双精度算术方面也(相对)较慢(与单精度算术性能相比)*,而且要大得多(以硅片的尺寸计算)。旧的GPU架构不支持大多数通用编程所需要的间接调用(通过函数指针),而最近的架构则支持的比较慢。最后,(正如其他答案所指出的那样),对于不能并行化的任务,GPU在给定相同的工作负载时,与CPU相比,GPU会输。请注意,这个回答是在2011年写的 – GPU技术是一个不断变化的领域。事情可能会有很大的不同,这取决于你什么时候读这篇文章 :P
**有些GPU在双精度运算方面并不慢,比如NVidia的Quadro或Tesla系列(Fermi世代或更新的),或者AMD的FirePro系列(GCN世代或更新的)。但这些都不在大多数消费者的机器中。
CPU就像一个超级快的工人。一个GPU就像一群克隆工人,他们的速度很快,但都必须同时做同样的事情(如果你想的话,你可以让一些克隆人闲置)
你更愿意选择哪一个作为你的同伴,一个超级快的家伙,还是100个速度不快的克隆人,他们实际上没有那么快,但都必须同时执行同样的动作?
对于某些操作,克隆人很好,比如扫地–他们可以各自扫一部分。
因为GPU被设计成一次做很多小事情,而CPU被设计成一次做一件事情。
你的CPU可以比你的GPU快很多很多,但是你的CPU做一个哈希运算的时间,你的GPU可能已经完成了几百个哈希运算的一部分。GPU被设计成同时做很多事情,而CPU被设计成同时做一件事,但速度非常快。
问题是,CPU和GPU是解决非常不同的问题的解决方案,有一点重叠,但一般来说,属于他们领域的东西都是在他们的领域里。我们不能用GPU来代替CPU,因为CPU坐在那里做的工作比GPU做的好得多,只是因为GPU不是用来做这个工作的,而CPU是用来做这个工作的。
一个小插曲,不过,如果有可能把CPU废掉,只用GPU,你不觉得我们会重命名吗?)
你真的是在问**为什么我们在CPU中不使用类似GPU的架构?我们把GPU借给非图形计算,是因为通用CPU在并行和浮点执行方面还达不到标准。例如,Niagara处理器是相当多任务的。SPARC T3 ](http://en.wikipedia.org/wiki/SPARC_T3)可以运行512个并发线程。
我相信每个GPU执行单元("核心")的地址空间比起CPU来说是非常有限的。
GPU执行单元不像CPU那样支持硬件中断。
我一直认为GPU执行单元的方式就像Playstation 3的 “SPE "一样,它们希望得到一个数据块,在上面运行一些顺序操作,然后吐出另一个数据块,冲洗,重复。它们没有主 "CPE "那么多的可寻址内存,但其想法是将每个 "SPE "分配给一个特定的顺序任务。一个单元的输出可能会反馈给另一个单元的输入。
如果执行单元试图 "分析 "数据,并根据数据的内容做出一堆决策,那么这些执行单元就不能很好地工作。
这些 "数据块 "可以是流的一部分,比如游戏状态表中的顶点列表、磁盘中的MPEG数据等。
如果有些东西不符合这种 "流 "模型,那么你的任务就不能有效地解析,GPU不一定是最好的解决方案。一个很好的例子就是处理基于 "外部事件 "的东西,比如键盘、操纵杆或网络输入。不符合这种模型的东西并不多,但总会有一些。
这是*****的时钟速度或目的。
有一个非常****的老争论,就是关于拥有大量的哑核或者是一小群非常聪明的核是好的。这可以很容易地追溯到80年代。
在CPU内部有很多可能的计算方式。更聪明的内核能够同时进行许多不同的计算(有点像多核,但不是,这很复杂;见指令级并行化)。一个智能内核可以同时进行多项计算(加、减、乘、除、内存运算),但一次只能进行一项;正因为如此,它们在物理上要比笨核大得多(因此价格也要贵得多)。在许多哑核和几个智能核之间有一个很好的平衡。
多核架构在图形处理方面效果很好,因为计算可以很容易地被分成几百个核,但这也取决于代码的质量,以及其他代码是否依赖于一个计算结果。更多信息,请阅读这篇关于CPU设计的文章:
现代微处理器–90分钟指南
我想提出一个语法上的问题。
如果一台计算机要用GPU作为主处理器,那么无论架构和设计如何,它都会成为 “中央处理单元"(CPU)。
需要记住的是,在架构空间里没有什么神奇的分界线,把一个处理器说成是 “中心 "处理器,把另一个说成是 "图形 "处理器。(嗯,有些GPU可能太残缺了,不可能完全是通用的,但那些不是我们这里所说的通用处理器)
的区别在于它们是如何安装在板子上的,以及赋予它们什么任务。当然,我们用通用处理器(或通用处理器集)来做主要的数据搬运工,而用特殊的、并行化的、深管道化的东西(比如图形)单元来做的事情(比如图形),才能最好地发挥它们的优势。
大多数让GPU做得非常快的花招,最初都是由试图做更快更好的CPU的人开发出来的。事实证明,Word和Excel和Netscape以及许多其他人们使用电脑的东西,不仅没有充分利用图形专用芯片提供的功能,甚至在这些架构上运行速度更慢,因为分支很多导致(非常昂贵和缓慢的)管道线清除。
我们之所以还在使用CPU,是因为CPU和GPU都有其独特的优势。见我下面的论文,被ACM Computing Surveys 2015接受,该论文对从 “CPU vs GPU的争论 "转向 "CPU-GPU协同计算 "进行了结论性的全面讨论。 A Survey of CPU-GPU异构计算技术的调查
gpus是很好的流处理器,你可以把流处理看成是将一长串数字按顺序乘以数组,cpus也有流处理能力(这就是所谓的SIMD扩展),但你不能把所有的编程逻辑都当作流处理来实现,而编译器可以选择创建btyecode,尽可能的使用simd指令。所以GPU可以处理、编码和解码图片、视频和其他类似的东西。
如果说简单的GPU可以比作是汽车中的拖车。因为通常情况下,后备箱对大多数人来说是足够的,除非他们买的东西真的很大。然后,他们可以需要拖车。GPU也是一样,因为通常情况下,有普通的CPU就可以完成大部分的任务。但是,如果你需要一些密集的计算,需要多线程的计算,那么你就需要GPU。