为什么我们仍然使用CPU而不是GPU?


373

在我看来,这些天来,很多计算都是在GPU上完成的。显然,图形是在此处完成的,但是使用CUDA等工具,AI,哈希算法(认为是比特币)和其他图形处理也可以在GPU上完成。为什么我们不能仅仅放弃CPU并单独使用GPU?是什么使GPU比CPU快得多?


3
我怎么知道哪些答案包含正确的信息?我应该等到其他人上/下投票赞成吗?我想我太急于接受答案了:O
ell

14
@ell现在有一些最新答案,其中不包含“错误信息”。由于出色设计的StackExchange的有效市场机制,他们逐渐以最高票数上升至最高;-)我建议稍等一会儿再接受答案。看起来您非常谨慎地正在执行此操作。顺便说一句,这是一个好问题。可能看起来很明显,但根本不是。谢谢你的询问!
Ellie Kesselman

124
有点像在问“如果波音747更快,更省油,为什么我们还要开汽车”?
vartec

7
不,因为它不是RISC与CISC。它是其他计算机科学基础知识之一,略有掩饰。这是“为什么我们将工作从中央处理器转移到I / O处理器上?”
JdeBP

5
@vartec:我认为在公共汽车和出租车之间可以有一个更好的类比。如果有40个人都想从同一个地方去同一个地方,那么公共汽车将更加有效率。如果有四十个人的理想出发地和目的地分散在各个地方,那么即使是一辆出租车也可能和一辆公共汽车一样好,并且就公共汽车的成本而言,一辆出租车可能会有多个出租车。
2015年

Answers:


388

TL; DR回答: GPU比CPU具有更多的处理器内核,但是由于每个GPU内核的运行速度都比CPU内核慢得多,并且不具有现代操作系统所需的功能,因此它们不适合每天执行大多数处理计算。它们最适合计算密集型操作,例如视频处理和物理模拟。


GPGPU仍然是一个相对较新的概念。GPU最初仅用于渲染图形。随着技术的进步,通过开发GPU的计算功能来利用GPU中相对于CPU的大量内核,以便无论数据是什么,它们都可以同时处理许多并行数据流。尽管GPU可能具有数百甚至数千个流处理器,但它们的运行速度都比CPU内核慢,并且具有较少的功能(即使它们的Turing完整并且可以被编程为运行CPU可以运行的任何程序)。GPU缺少的功能包括中断和虚拟内存,这是实现现代操作系统所必需的。

换句话说,CPU和GPU具有明显不同的架构,使其更适合于不同的任务。GPU可以处理许多流中的大量数据,对其执行相对简单的操作,但不适用于对单个或几个数据流进行繁重或复杂的处理。CPU在每个核的基础上(以每秒的指令数计)要快得多,并且可以更轻松地对单个或几个数据流执行复杂的操作,但不能有效地同时处理多个流。

结果,GPU不适合处理无法从中受益或无法并行化的任务,包括许多常见的消费类应用程序,例如文字处理器。此外,GPU使用根本不同的架构。一个人必须为GPU专门编写一个应用程序,然后才能工作,并且对GPU进行编程需要明显不同的技术。这些不同的技术包括新的编程语言,对现有语言的修改以及新的编程范例,它们更适合于将计算表示为要由许多流处理器执行的并行操作。有关编程GPU所需技术的更多信息,请参见Wikipedia上有关流处理并行计算的文章

现代GPU能够执行矢量运算和浮点算术,而最新的卡则能够处理双精度浮点数。诸如CUDA和OpenCL之类的框架使程序能够为GPU编写,并且GPU的性质使它们最适合高度并行化的操作,例如科学计算中的一系列专用GPU计算卡可以替代小型的计算集群,如NVIDIA Tesla个人超级计算机一样。拥有Folding @ home经验的拥有现代GPU的消费者可以使用它们为GPU客户端做出贡献,GPU客户端可以以非常高的速度执行蛋白质折叠模拟并为项目做出更多贡献(请务必阅读FAQs)首先,尤其是与GPU相关的内容)。GPU还可以使用PhysX在视频游戏中实现更好的物理模拟,加速视频编码和解码,并执行其他计算密集型任务。GPU最适合执行这些类型的任务。

AMD率先推出了称为加速处理单元(APU)的处理器设计,该处理器将传统的x86 CPU内核与GPU结合在一起。这种方法使图形性能大大优于主板集成的图形解决方案(尽管无法与更昂贵的分立GPU匹敌),并允许具有良好多媒体性能的紧凑,低成本系统,而无需单独的GPU。最新的英特尔处理器还提供了片上集成图形,尽管竞争性集成GPU性能目前仅限于使用Intel Iris Pro Graphics的少数芯片。随着技术的不断发展,这些曾经分离的零件的融合程度将会越来越高。AMD的设想未来,CPU和GPU可以集成在一起,能够无缝地完成同一任务

尽管如此,由PC操作系统和应用程序执行的许多任务仍然更适合CPU,并且需要大量工作来使用GPU加速程序。由于许多现有软件都使用x86架构,并且因为GPU需要不同的编程技术并且缺少操作系统所需的几个重要功能,所以日常计算从CPU到GPU的一般过渡非常困难。


39
像这个答案一样,我认为主要原因是我们没有好的主流编程语言来处理像这样的并行架构。数十年来,我们一直在努力推进多线程编程,而人们仍在呼吁多线程“邪恶”。尽管多核CPU和GPU已成为现实,但我们将不得不提出新的编程范例来应对这一问题。
索伦

值得一提的是,英特尔一直在研究Larrabee架构(时间太长了),该架构本质上是一个带有大量x86内核的芯片。
克里斯S

讨论硬件原因,讨论APU以及它们将如何改变这些原因的绝佳答案。但是,@ Soren在软件方面非常好。实际上,这是硬件问题,软件问题以及CPU正常工作的事实的组合,并且当已知某项工作正常时,很难让人更换它。
Nich Del

3
“我们没有好的主流编程语言来处理像这样的并行架构。” -Haskell,OCaml,Scheme,F#,Erlang和几乎所有其他函数式编程语言都很好地处理了多线程。我提到的都是主流。
BlueRaja-Danny Pflughoeft 2011年

1
@BlueRaja-我们知道这些语言,您对主流的定义必须与我的不同:-)
Soren

252

是什么使GPU比CPU快得多?

该GPU是不是比CPU快。CPU和GPU的设计具有两个不同的目标,需要权衡取舍,因此它们具有不同的性能特征。在CPU中,某些任务更快,而在GPU中,其他任务则更快。CPU擅长对少量数据进行复杂的操作,GPU擅长对大量数据进行简单的操作。

GPU是专用CPU,其设计目的是使一条指令可以处理大数据块(SIMD /单指令多数据),所有这些块都应用相同的操作。数据块中的工作肯定比一次处理单个单元的效率更高,因为解码指令的开销大大减少了,但是在大块中工作意味着有更多的并行工作单元,因此它使用了更多的晶体管实现单个GPU指令(导致物理尺寸限制,使用更多能量并产生更多热量)。

CPU被设计为在单个数据上尽快执行一条指令。由于它只需要处理单个数据,因此执行单个指令所需的晶体管数量要少得多,因此CPU可以负担得起更大的指令集,更复杂的ALU,更好的分支预测,更好的虚拟化架构,以及更复杂的缓存/管道方案。它的指令周期也更快。

我们仍在使用CPU的原因不是因为x86是CPU体系结构的王者,而Windows是为x86编写的,我们之所以仍在使用CPU的原因是操作系统需要执行的任务类型,即决策,在CPU架构上更高效地运行。操作系统需要查看数百种不同类型的数据,并做出相互依赖的各种决策。这种工作不容易并行化,至少不能并行化到SIMD体系结构中。

将来,随着CPU获得处理数据块(例如SSE)的功能,我们将看到CPU与GPU体系结构之间的融合。此外,随着制造技术的提高和芯片尺寸的减小,GPU可以负担得起执行更复杂的指令的需要。


23
这可能是最好的答案。重要的是要了解两个范例之间的根本差异。考虑到当今的工作负载,要使GPU超过CPU,从本质上讲意味着GPU必须转变为CPU。因此,问题就是答案。
surfasb 2011年

2
+1是最好的答案。这个和公认的答案都是正确的,但是这个解释得更清楚。

令我惊讶的是,该线程中没有人提到将数据发送到GPU的开销-PCI-Express总线上有限的带宽使GPU上的某些并行操作比在CPU上执行的速度慢得多。可以看到一个简单的情况,由于发送数据,设置上下文和回读结果的开销,改变FFT的大小在GPU与CPU上的性能产生了显着差异:stackoverflow.com/a/8687732/303612较小的操作可以在CPU上的缓存中执行,并且内存带宽大大优于当前的PCI-E架构
Andrew Burnett-Thompson博士2015年

1
@ Dr.AndrewBurnett-Thompson:那是因为这与问题无关。当前,GPU被认为是辅助处理单元,这就是为什么将数据移入/移出GPU既必要又昂贵的原因。如果我们将GPU视为一流的处理单元,则无需在主内存和GPU内存之间封送数据。
Lie Ryan

1
不乐观,带宽开销不是零。如果具有GPU架构的处理器运行整个节目,则无需移动任何东西,GPU内存主内存。首先没有传输开销,因为没有传输。顺便说一下,这并不是假设,AMD的APU使用HSA(异构系统架构)和统一的主内存,该内存允许在CPU和GPU之间进行零复制。
Lie Ryan

75

GPU缺乏:

  1. 虚拟内存 (!!!)
  2. 寻址除存储器之外的设备的方法(例如键盘,打印机,辅助存储器等)
  3. 中断

您需要这些工具才能实现类似于现代操作系统的任何功能。

与双精度算术性能(与单精度算术性能相比)*相比,它们也相对较慢,并且在硅尺寸方面要大得多。较旧的GPU架构不支持大多数通用编程所需的间接调用(通过函数指针),而较新的架构则这样做的速度很慢。最后,(如其他答案所指出的),对于无法并行执行的任务,与给定相同工作负载的CPU相比,GPU会丢失。

编辑:请注意,此回复写于2011年-GPU技术是一个不断变化的领域。取决于您何时阅读此内容:P

*某些GPU在双精度算法上并不慢,例如NVidia的Quadro或Tesla系列(Fermi或更高版本),或AMD的FirePro系列(GCN或更高版本)。但是大多数消费者的机器中都没有这些。


@蝉:您对此有参考吗?无论如何,即使是这样,在这种情况下,即使是最新的硬件也无法正常运行。(例如,相对于CPU而言没有太多的性能优势-以及功耗劣势)
Billy ONeal

3
是的,您所说的Fermi设备(带有CUDA 4.0和sm_20)支持间接跳转(因此支持C ++虚拟方法,继承等)。
愤怒的生菜

来自300美元的2年旧GPU的544 GigaFLOPS慢吗?
Ben Voigt

2
@Ben:您只能在数据并行应用程序中获得这种性能。一般顺序操作是完全不同的游戏。(只有该芯片上的所有1600个内核并行运行,一次又一次地运行基本上相同的指令……甚至是理论上的,而不是实际的性能)
Billy ONeal

@Billy:但是这是特定类算法的慢,而不是双精度算术的慢(这就是你所说的)。(CPU通常也不会达到基准吞吐量)
Ben Voigt

37

CPU就像一个超级快的工人。GPU就像一群快速运行的克隆工作组,但是所有这些工作组必须一致地做完全相同的事情(除了您可以让某些克隆处于空闲状态之外)

作为开发人员,一个超级快速的家伙或100个速度不快但实际上都必须同时执行相同动作的快速克隆,您宁愿选择哪一个呢?

对于某些动作,克隆非常好,例如扫地-它们每个都可以扫一部分。

对于某些操作,克隆会发臭,例如,写每周报告-除一个克隆外,所有克隆都闲着,而一个克隆写报告(否则,您只能获得100个相同报告的副本)。


4
我什至可以...两者都有吗?
凯文·潘科

22
@Kevin:是的,但是您需要一台同时具有CPU GPU 的计算机!如果只有这样的事情!
约阿希姆·绍尔

3
打个比方。会记住这一点。
Mayo

23

因为GPU被设计为一次执行很多小事情,而CPU被设计为一次执行一件事情。如果您的进程可以像散列一样大规模并行化,则GPU的速度要快几个数量级,否则就不会如此。

您的CPU可以比GPU更快,更快速地计算哈希-但是,花费CPU的时间,GPU可能会经历数百个哈希。GPU旨在同时执行许多操作,CPU旨在一次执行一项操作,但速度非常快。

问题在于,CPU和GPU是解决非常不同问题的完全不同的解决方案,存在一点重叠,但通常它们的领域仍在他们的领域中。我们不能用GPU代替CPU,因为坐在那里的CPU比GPU可以做的更好,这仅仅是因为GPU并不是为执行此任务而设计的,而CPU正是。

不过,有一点要注意的是,如果有可能报废CPU而只有GPU,您是否认为我们已将其重命名?:)


我认为大多数现代CPU旨在一次执行2、4或8项操作。
danielcg 2013年

@ danielcg25:大多数现代GPU都设计为一次执行256、512、1024项(GTX 680具有1536个 CUDA内核)。从概念上讲,每个CPU核心都是一个独立的实体,但是GPU并非如此。
Phoshi

@ danielcg25:我知道,但是如果有人在不知道该主题的情况下阅读了它,那么对答案的根本性(尽管是故意的)误解可能是有害的。从某种意义上说,“做个屁股”在SE上并没有得到真正的认可,因为它降低了信噪比。
Phoshi

我只是提供一些信息。如今,大多数计算机实际上能够一次处理2-8个事物。一些处理器可以做的甚至更多。它仍然不能与同时执行100多个功能的GPU接近。
danielcg

@ danielcg25:但是,这是另一种处理方式,这就是问题所在。每个CPU内核实际上是独立的,使用自己的数据块和自己的进程。每个CPU内核执行彼此不同的单独任务,并且它们不会线性地向上扩展-八核内核的有用性不及四核内核的两倍,也不是双核内核的两倍。另一方面,GPU内核跨不同的数据块执行相同的任务,并且线性扩展。显然存在多核CPU,但这不是同一回事
Phoshi

14

您是否真的在问我们为什么不在CPU中使用类似GPU的架构?

GPU只是图形卡的专用CPU。我们提供GPU非图形计算功能是因为通用CPU不能并行执行浮点运算。

实际上,我们正在使用不同的(更多GPU风格的)CPU架构。例如,尼亚加拉处理器是非常多任务的。SPARC T3将运行512个并发线程。


为什么要投票?
jkj 2011年

3
我猜最后一行,因为这完全是假的。实际上,我只能想到一个仅x86的主流操作系统;甚至已经将它移植到了alpha和ARM处理器上,但目前还没有商用。
哈维尔

好。删除了最后一部分,我对主流操作系统支持的看法妨碍了对新体系结构的更改。可能不在答案范围内。
jkj 2011年

11

我在这里可能会犯了一个可怕的错误,并且在这个主题上的发言权很少或没有权威,但是这里有:

  • 我相信与CPU相比,每个GPU执行单元(“核心”)的地址空间都非常有限。

  • GPU执行单元无法有效处理分支。

  • GPU执行单元不像CPU那样支持硬件中断。

我一直认为GPU执行单元的使用方式类似于Playstation 3“ SPE”,它们想要被分配一个数据块,对其执行一系列顺序操作,然后吐出另一个数据块。数据,冲洗,重复。它们没有主要的“ CPE”可寻址内存那么多,但是其想法是将每个“ SPE”专用于特定的顺序任务。一个单元的输出可能会馈入另一单元的输入。

如果执行单元试图“分析”数据并根据数据是什么做出一堆决策,它们将无法正常工作。

这些“数据块”可以是流的一部分,例如游戏状态表中的顶点列表,磁盘中的MPEG数据等。

如果某些东西不适合这种“流”模型,那么您将面临无法有效并行化的任务,GPU不一定是最佳解决方案。一个很好的例子是处理诸如键盘,操纵杆或网络输入之类的“外部事件”。没有很多不适合该模型的东西,但是总会有一些。


关于分支预测优化的要点-我从没考虑过,但是您是对的。
Jimmy Breck-McKye 2013年

6

这与时钟速度或目的无关。他们俩同样有能力完成大部分(甚至不是全部)任务;但是,有些任务比其他任务更适合一些任务。

已经有一个非常一下是否是更好的有很多愚蠢的核心或一小群非常聪明核心的旧说法。这很容易追溯到80年代。

在CPU内部,可以完成许多可能的计算。更智能的内核能够同时执行许多不同的计算(有点像多核,但不是很复杂;请参见指令级并行性)。一个智能内核可以同时执行多个计算(加,减,乘,除,内存运算),但一次只能进行一次;因此,它们的物理尺寸比笨重的芯大(因此价格更高)。

笨拙的内核要小得多,因此可以将更多内核添加到单个芯片中,但无法进行那么多同时计算。许多哑核和几个智能核之间都达到了很好的平衡。

多核体系结构可以很好地与图形配合使用,因为计算可以轻松地分成数百个核,但是它也取决于代码的质量以及其他代码是否依赖于一个计算的结果。

这是一个比看起来复杂得多的问题。有关更多信息,请阅读有关CPU设计的本文:

现代微处理器-90分钟指南

http://www.lighterra.com/papers/modernmicroprocessors/


请原谅语法不佳,并且在上面使用的一般低于标准的写作风格,我还没有喝咖啡。这是一个相当复杂的概念,如果您想了解更多信息,那么包含的链接就是您应该去的地方。这不是我的错误解释
Silverfire

1
我已经为您修复了它,并添加了一个链接。
bwDraco

5

我想提出一个语法要点:术语CPU和GPU是功能名称,而不是体系结构名称。

如果计算机将GPU用作其主处理器,则无论架构和设计如何,它都将成为“中央处理单元”(CPU)。


4

重要的是要记住,架构空间中没有神奇的分界线,它使一个处理器成为“中央”处理器,而另一个使处理器成为“图形”处理器。(好吧,有些GPU可能太残废了,无法完全通用,但是这些不是我们在这里谈论的。)

区别是它们在板上的安装方式以及赋予它们的任务之一。当然,对于主数据移动器,我们使用通用处理器(或一组通用处理器),而对于事物(例如图形),则使用特殊的,并行化的,深度管道的单元,以充分利用它们。

用于使GPU快速完成其任务的大多数巧妙技巧都是由试图使CPU更快,更好的人开发的。事实证明,Word,Excel和Netscape以及人们用于计算机的许多其他事情,不仅不能充分利用图形专用芯片提供的功能,而且在这些体系结构上运行速度甚至更慢,因为分支的原因很多(非常昂贵)和缓慢)管道清理。


1
我认为,流水线开销是缺少较高答案的基本细节。
史蒂夫

2

完全有一个GPU的全部目的是使CPU摆脱当时正在进行的昂贵的图形计算。
通过将它们再次组合到单个处理器中,将回到所有起点。


是的,前进了一步,后退了两步。
兰道夫·理查森

2

原因很简单:大多数应用程序不是多线程/矢量化的。

图形卡至少在概念上严重依赖多线程。

比较一下具有单个引擎的汽车,每个车轮具有一个较小引擎的汽车。对于后一种汽车,您需要命令所有引擎,这从系统编程的角度来看尚未考虑在内。

但是,通过AMD融合,它将改变我们需要利用处理能力的方式:要么矢量化,要么对一个线程快速。


2

我们仍然使用CPU的原因是CPU和GPU都有其独特的优势。请参阅我的以下论文,该论文已被ACM Computing Surveys 2015接受,其中提供了关于从“ CPU vs GPU辩论”转向“ CPU-GPU协作计算”的结论性和全面的讨论。

CPU-GPU异构计算技术概述


1

如果简单地说,GPU可以与汽车中的拖车相提并论。通常情况下,行李箱对大多数人来说就足够了,除非他们购买了非常大的东西。然后他们可能需要拖车。与GPU相同,通常拥有足以完成大多数任务的普通CPU就足够了。但是,如果您需要在多个线程中进行大量的计算,则可能需要GPU


1

GPU是很好的流处理器。您可以将流处理视为顺序地将一长串数字相乘。cpus还具有流处理功能(称为SIMD扩展),但是您不能将所有编程逻辑都实现为流处理,并且编译器可以选择创建btyecode,该代码可以在可能的情况下使用simd指令。

并非所有事物都是数字数组。图片和视频也可能是声音(这里和那里都有opencl编码器)。因此GPU可以处理,编码和解码图片,视频和类似内容。一个缺点是您不能将所有内容都转移到游戏中的GPU,因为这会造成结结,GPU忙于图形处理,并且在玩游戏时被认为是系统的瓶颈。最佳解决方案将是充分利用PC中的所有组件。因此,例如,默认情况下,NVIDIA的physx引擎在完全使用gpu时会对cpu进行计算。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.