在我看来,这些天来,很多计算都是在GPU上完成的。显然,图形是在此处完成的,但是使用CUDA等工具,AI,哈希算法(认为是比特币)和其他图形处理也可以在GPU上完成。为什么我们不能仅仅放弃CPU并单独使用GPU?是什么使GPU比CPU快得多?
在我看来,这些天来,很多计算都是在GPU上完成的。显然,图形是在此处完成的,但是使用CUDA等工具,AI,哈希算法(认为是比特币)和其他图形处理也可以在GPU上完成。为什么我们不能仅仅放弃CPU并单独使用GPU?是什么使GPU比CPU快得多?
Answers:
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的一般过渡非常困难。
是什么使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可以负担得起执行更复杂的指令的需要。
GPU缺乏:
您需要这些工具才能实现类似于现代操作系统的任何功能。
与双精度算术性能(与单精度算术性能相比)*相比,它们也相对较慢,并且在硅尺寸方面要大得多。较旧的GPU架构不支持大多数通用编程所需的间接调用(通过函数指针),而较新的架构则这样做的速度很慢。最后,(如其他答案所指出的),对于无法并行执行的任务,与给定相同工作负载的CPU相比,GPU会丢失。
编辑:请注意,此回复写于2011年-GPU技术是一个不断变化的领域。取决于您何时阅读此内容:P
*某些GPU在双精度算法上并不慢,例如NVidia的Quadro或Tesla系列(Fermi或更高版本),或AMD的FirePro系列(GCN或更高版本)。但是大多数消费者的机器中都没有这些。
CPU就像一个超级快的工人。GPU就像一群快速运行的克隆工作组,但是所有这些工作组必须一致地做完全相同的事情(除了您可以让某些克隆处于空闲状态之外)
作为开发人员,一个超级快速的家伙或100个速度不快但实际上都必须同时执行相同动作的快速克隆,您宁愿选择哪一个呢?
对于某些动作,克隆非常好,例如扫地-它们每个都可以扫一部分。
对于某些操作,克隆会发臭,例如,写每周报告-除一个克隆外,所有克隆都闲着,而一个克隆写报告(否则,您只能获得100个相同报告的副本)。
因为GPU被设计为一次执行很多小事情,而CPU被设计为一次执行一件事情。如果您的进程可以像散列一样大规模并行化,则GPU的速度要快几个数量级,否则就不会如此。
您的CPU可以比GPU更快,更快速地计算哈希-但是,花费CPU的时间,GPU可能会经历数百个哈希。GPU旨在同时执行许多操作,CPU旨在一次执行一项操作,但速度非常快。
问题在于,CPU和GPU是解决非常不同问题的完全不同的解决方案,存在一点重叠,但通常它们的领域仍在他们的领域中。我们不能用GPU代替CPU,因为坐在那里的CPU比GPU可以做的更好,这仅仅是因为GPU并不是为执行此任务而设计的,而CPU正是。
不过,有一点要注意的是,如果有可能报废CPU而只有GPU,您是否认为我们已将其重命名?:)
您是否真的在问我们为什么不在CPU中使用类似GPU的架构?
GPU只是图形卡的专用CPU。我们提供GPU非图形计算功能是因为通用CPU不能并行执行浮点运算。
实际上,我们正在使用不同的(更多GPU风格的)CPU架构。例如,尼亚加拉处理器是非常多任务的。SPARC T3将运行512个并发线程。
我在这里可能会犯了一个可怕的错误,并且在这个主题上的发言权很少或没有权威,但是这里有:
我相信与CPU相比,每个GPU执行单元(“核心”)的地址空间都非常有限。
GPU执行单元无法有效处理分支。
GPU执行单元不像CPU那样支持硬件中断。
我一直认为GPU执行单元的使用方式类似于Playstation 3“ SPE”,它们想要被分配一个数据块,对其执行一系列顺序操作,然后吐出另一个数据块。数据,冲洗,重复。它们没有主要的“ CPE”可寻址内存那么多,但是其想法是将每个“ SPE”专用于特定的顺序任务。一个单元的输出可能会馈入另一单元的输入。
如果执行单元试图“分析”数据并根据数据是什么做出一堆决策,它们将无法正常工作。
这些“数据块”可以是流的一部分,例如游戏状态表中的顶点列表,磁盘中的MPEG数据等。
如果某些东西不适合这种“流”模型,那么您将面临无法有效并行化的任务,GPU不一定是最佳解决方案。一个很好的例子是处理诸如键盘,操纵杆或网络输入之类的“外部事件”。没有很多不适合该模型的东西,但是总会有一些。
这与时钟速度或目的无关。他们俩同样有能力完成大部分(甚至不是全部)任务;但是,有些任务比其他任务更适合一些任务。
已经有一个非常一下是否是更好的有很多愚蠢的核心或一小群非常聪明核心的旧说法。这很容易追溯到80年代。
在CPU内部,可以完成许多可能的计算。更智能的内核能够同时执行许多不同的计算(有点像多核,但不是很复杂;请参见指令级并行性)。一个智能内核可以同时执行多个计算(加,减,乘,除,内存运算),但一次只能进行一次;因此,它们的物理尺寸比笨重的芯大(因此价格更高)。
笨拙的内核要小得多,因此可以将更多内核添加到单个芯片中,但无法进行那么多同时计算。许多哑核和几个智能核之间都达到了很好的平衡。
多核体系结构可以很好地与图形配合使用,因为计算可以轻松地分成数百个核,但是它也取决于代码的质量以及其他代码是否依赖于一个计算的结果。
这是一个比看起来要复杂得多的问题。有关更多信息,请阅读有关CPU设计的本文:
现代微处理器-90分钟指南
重要的是要记住,架构空间中没有神奇的分界线,它使一个处理器成为“中央”处理器,而另一个使处理器成为“图形”处理器。(好吧,有些GPU可能太残废了,无法完全通用,但是这些不是我们在这里谈论的。)
区别是它们在板上的安装方式以及赋予它们的任务之一。当然,对于主数据移动器,我们使用通用处理器(或一组通用处理器),而对于事物(例如图形),则使用特殊的,并行化的,深度管道的单元,以充分利用它们。
用于使GPU快速完成其任务的大多数巧妙技巧都是由试图使CPU更快,更好的人开发的。事实证明,Word,Excel和Netscape以及人们用于计算机的许多其他事情,不仅不能充分利用图形专用芯片提供的功能,而且在这些体系结构上运行速度甚至更慢,因为分支的原因很多(非常昂贵)和缓慢)管道清理。
我们仍然使用CPU的原因是CPU和GPU都有其独特的优势。请参阅我的以下论文,该论文已被ACM Computing Surveys 2015接受,其中提供了关于从“ CPU vs GPU辩论”转向“ CPU-GPU协作计算”的结论性和全面的讨论。
如果简单地说,GPU可以与汽车中的拖车相提并论。通常情况下,行李箱对大多数人来说就足够了,除非他们购买了非常大的东西。然后他们可能需要拖车。与GPU相同,通常拥有足以完成大多数任务的普通CPU就足够了。但是,如果您需要在多个线程中进行大量的计算,则可能需要GPU
GPU是很好的流处理器。您可以将流处理视为顺序地将一长串数字相乘。cpus还具有流处理功能(称为SIMD扩展),但是您不能将所有编程逻辑都实现为流处理,并且编译器可以选择创建btyecode,该代码可以在可能的情况下使用simd指令。
并非所有事物都是数字数组。图片和视频也可能是声音(这里和那里都有opencl编码器)。因此GPU可以处理,编码和解码图片,视频和类似内容。一个缺点是您不能将所有内容都转移到游戏中的GPU,因为这会造成结结,GPU忙于图形处理,并且在玩游戏时被认为是系统的瓶颈。最佳解决方案将是充分利用PC中的所有组件。因此,例如,默认情况下,NVIDIA的physx引擎在完全使用gpu时会对cpu进行计算。