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

评论

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

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

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

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

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

#1 楼

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


GPGPU仍然是一个相对较新的概念。 GPU最初仅用于渲染图形。随着技术的进步,GPU相对于CPU的大量内核被用于开发GPU的计算能力,从而使它们可以同时处理许多并行数据流,而不管这些数据可能是什么。尽管GPU可以具有数百甚至数千个流处理器,但它们每个都比CPU内核运行得慢,并且具有较少的功能(即使它们的Turing完整并且可以被编程为运行CPU可以运行的任何程序)。 GPU缺少的功能包括中断和虚拟内存,这是实现现代操作系统所必需的。换句话说,CPU和GPU具有明显不同的体系结构,使其更适合于不同任务。 GPU可以处理许多流中的大量数据,对其执行相对简单的操作,但不适用于对单个或几个数据流进行繁重或复杂的处理。一个CPU在每个核的基础上要快得多(按照每秒的指令数计算),并且可以更轻松地对单个或几个数据流执行复杂的操作,但不能同时有效地处理多个流。

结果,GPU不适合处理无法从中受益或无法并行化的任务,包括许多常见的消费类应用程序,例如文字处理器。此外,GPU使用根本不同的架构。人们必须为GPU专门编写一个应用程序,然后才能工作,而对GPU进行编程则需要明显不同的技术。这些不同的技术包括新的编程语言,对现有语言的修改以及新的编程范例,它们更适合于将计算表示为要由许多流处理器执行的并行操作。有关编程GPU所需技术的更多信息,请参见Wikipedia上有关流处理和并行计算的文章。操纵双精度浮点数。诸如CUDA和OpenCL之类的框架使程序能够为GPU编写,并且GPU的性质使它们最适合高度并行化的操作,例如在科学计算中,在该计算中,一系列专用的GPU计算卡可以替代小型的计算集群,就像NVIDIA Tesla个人超级计算机一样。具有Folding @ home经验的拥有现代GPU的消费者可以使用它们为GPU客户端提供帮助,GPU客户端可以以极高的速度执行蛋白质折叠模拟并为项目做出更多的工作(请务必先阅读FAQ,尤其是有关FAQ的内容)。 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的一般过渡非常困难。

评论


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

–索伦
2011年7月10日在18:47

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

–克里斯S
2011年7月10日在21:07

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

– Nich Del
2011年7月10日在21:40



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

– BlueRaja-Danny Pflughoeft
2011年7月11日下午6:56

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

–索伦
2011年7月18日,下午5:03

#2 楼


是什么使GPU比CPU快得多?


GPU并不比CPU快。 CPU和GPU的设计目标是两个不同的目标,需要权衡取舍,因此它们具有不同的性能特征。在CPU中,某些任务更快,而在GPU中,其他任务则更快。 CPU擅长对少量数据进行复杂的操作,GPU擅长对大量数据进行简单的操作。指令处理一个大数据块(SIMD /单指令多数据),所有这些块都应用相同的操作。数据块中的工作肯定比一次处理单个单元的效率更高,因为解码指令的开销大大减少,但是在大块中工作意味着存在更多的并行工作单元,因此它使用了更多的晶体管来实现一条GPU指令(导致物理尺寸限制,消耗更多的能量并产生更多的热量)。

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

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

将来,随着CPU获得处理数据块(例如数据块)的能力,我们将看到CPU与GPU架构之间的融合。上证所另外,随着制造技术的进步和芯片尺寸的缩小,GPU可以负担得起执行更复杂的指令的要求。

评论


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

– surfasb
2011年7月11日在9:22

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

–user89061
2011年7月11日在16:09

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

– ABT博士
2015年2月27日在12:11



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

– Lie Ryan
2015年2月27日在12:51



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

– Lie Ryan
2015年2月27日在17:40



#3 楼

GPU缺乏:


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

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

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

编辑:请注意,此响应写于2011年-GPU科技是一个不断变化的领域。取决于您何时阅读本文,情况可能会大不相同:P

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

评论


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

–比利·奥尼尔(Billy ONeal)
2011年7月11日14:56

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

–生气的生菜
2011年7月11日15:04

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

– Ben Voigt
2011-09-12 4:35

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

–比利·奥尼尔(Billy ONeal)
2011-09-12 13:13



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

– Ben Voigt
2011-09-14 12:26

#4 楼

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

您是否愿意像您的开发人员一样,拥有一个超级快的家伙或100个实际上不那么快,但都必须同时执行相同操作的快速克隆?

对于某些操作,这些克隆是很好,例如

克隆对于某些动作来说很臭,例如。编写每周报告-除一个克隆外,所有克隆都闲置,而一个克隆在写该报告(否则,您只会得到100个相同报告的副本)。

评论


我什至可以...两者都有吗?

–凯文·潘科(Kevin Panko)
2011年7月12日在21:18

@Kevin:是的,但是您需要一台同时具有CPU和GPU的计算机!如果只有这样的事情!

– Joachim Sauer
2011年7月14日在7:37

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

– Mayo
2015年6月25日14:54

#5 楼

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

您的CPU可以计算出的散列比GPU快得多,但是花费您的CPU时间,GPU可能会经历数百次散列。 GPU旨在同时执行许多操作,而CPU旨在一次执行一项操作,但速度非常快。完全不同的问题,有一点重叠,但通常他们的领域仍在他们的领域中。我们不能用GPU代替CPU,因为坐在那里的CPU比GPU可以做的更好,这仅仅是因为GPU并不是为执行此任务而设计的,而是CPU。

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

评论


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

– danielcg
13年2月11日在6:07

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

– Ph子
13年2月11日于13:04

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

– Ph子
13年2月12日在14:23

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

– danielcg
13年2月13日在3:13

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

– Ph子
13年2月13日在13:50

#6 楼

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

GPU只是图形卡的专用CPU。我们提供GPU非图形计算功能是因为通用CPU不能同时满足并行和浮点执行的要求。

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

评论


为什么要投票?

– jkj
2011年7月10日在21:01

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

–哈维尔
2011年7月11日,下午3:27

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

– jkj
2011年7月11日在7:11



#7 楼

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


我相信每个GPU执行单元(“核心”)的功能都非常有限与CPU相比的地址空间。
GPU执行单元不能有效地处理分支。
GPU执行单元不像CPU一样支持硬件中断。

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

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

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

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

评论


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

–吉米·布雷克·麦基(Jimmy Breck-McKye)
2013年9月14日21:05

#8 楼

这与时钟速度或目的无关。他们俩同样有能力完成大部分(即使不是全部)任务。
有一个古老的争论是,拥有大量的哑核还是一小组非常聪明的核是更好的选择。这可以轻松追溯到80年代。
在CPU内部,可以完成许多可能的计算。更智能的内核能够同时执行许多不同的计算(有点像多核,但不是很复杂;请参见指令级并行性)。一个智能内核可以同时进行多个计算(加,减,乘,除,内存运算),但一次只能进行一次;因此,它们在物理上比笨拙的核更大(因此价格更高)。
笨拙的核要小得多,因此可以在单个芯片上添加更多的核,但是却无法进行那么多同时计算。许多哑核和一些智能核之间都达到了很好的平衡。
多核体系结构可以很好地与图形配合使用,因为可以轻松地将计算拆分成数百个核,但这也取决于代码的质量。以及其他代码是否依赖于一次计算的结果。
这是一个比看起来要复杂得多的问题。有关更多信息,请阅读有关CPU设计的文章:

现代微处理器-90分钟指南
http://www.lighterra.com/papers/modernmicroprocessors/


评论


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

–银火
2011年7月12日4:39



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

–bwDraco
2011年7月12日17:22



#9 楼

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

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

#10 楼

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

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

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

评论


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

–史蒂夫
2015年4月9日在23:08

#11 楼

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

评论


是的,前进了一步,后退了两步。

–兰道夫·理查森(Randolf Richardson)
11年8月12日在19:58

#12 楼

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

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

比较具有单引擎,即每轮只有一个较小引擎的汽车。对于后一种汽车,您需要命令所有引擎,而从系统编程的角度来看,这是没有考虑到的。

通过AMD融合,它将改变我们的需求利用处理能力:既可以向量化,也可以快速处理一个线程。

#13 楼

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

CPU-GPU异构计算技术概述

#14 楼

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

#15 楼

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

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