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

ell*_*ell 393 cpu gpu gpgpu cuda

在我看来,现在很多计算都是在 GPU 上完成的。显然图形是在那里完成的,但使用 CUDA 等,人工智能、散列算法(想想比特币)和其他也在 GPU 上完成。为什么我们不能摆脱CPU,单独使用GPU?是什么让 GPU 比 CPU 快这么多?

bwD*_*aco 406

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


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

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

因此,GPU 不适合处理不能显着受益或无法并行化的任务,包括许多常见的消费类应用程序,如文字处理器。此外,GPU 使用完全不同的架构;人们必须专门为 GPU 编写一个应用程序才能使其工作,而对 GPU 进行编程需要截然不同的技术。这些不同的技术包括新的编程语言、对现有语言的修改以及更适合将计算表示为由许多流处理器执行的并行操作的新编程范式。有关对 GPU 进行编程所需的技术的更多信息,请参阅维基百科关于流处理并行计算的文章

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

AMD 开创了一种称为加速处理单元 (APU)的处理器设计,它结合了传统的 x86 CPU 内核和 GPU。这种方法使图形性能大大优于主板集成图形解决方案(尽管无法与更昂贵的独立 GPU 匹敌),并允许紧凑、低成本的系统具有良好的多媒体性能,而无需单独的 GPU。最新的英特尔处理器还提供片上集成显卡,但具有竞争力的集成 GPU 性能目前仅限于少数配备英特尔 Iris Pro 显卡的芯片。随着技术的不断进步,我们将看到这些曾经独立的部分越来越趋同。AMD 设想CPU 和 GPU 合二为一的未来,能够在同一任务上无缝协作

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

  • 像这个答案,我认为主要原因是我们没有很好的主流编程语言来处理这样的并行架构。几十年来,我们一直在努力推进多线程编程,但人们仍在称多线程为“邪恶”。尽管多核 CPU 和 GPU 已成为现实,我们将不得不提出新的编程范式来解决这个问题。 (41认同)
  • *“我们没有好的主流编程语言来处理这样的并行架构。”* - Haskell、OCaml、Scheme、F#、Erlang 以及几乎任何其他函数式编程语言都可以很好地处理多线程。我说的都是主流。 (3认同)
  • @BlueRaja——我们知道这些语言,你对主流的定义必须与我的不同:-) (2认同)

Lie*_*yan 259

是什么让 GPU 比 CPU 快这么多?

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

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

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

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

未来,我们将看到 CPU 和 GPU 架构之间的融合,因为 CPU 获得了处理数据块的能力,例如 SSE。此外,随着制造技术的改进和芯片的变小,GPU 能够执行更复杂的指令。

  • 这可能是这里最好的答案。了解这两种范式之间的根本区别很重要。GPU要超越CPU,考虑到今天的工作负载,本质上意味着GPU必须变成CPU。因此,问题就是答案。 (23认同)
  • +1 因为这是最好的答案。这个答案和公认的答案都是正确的,但是这个答案更清楚地解释了它。 (2认同)

Bil*_*eal 77

GPU 缺乏:

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

您需要这些才能实现现代操作系统之类的任何东西。

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

编辑:请注意,这个回复是在 2011 年写的——GPU 技术是一个不断变化的领域。根据您阅读本文的时间,情况可能会大不相同:P

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

  • 是的,如您所说的 Fermi 设备(使用 CUDA 4.0 和 sm_20),支持间接跳转(因此支持 C++ 虚拟方法、继承等)。 (3认同)
  • @Ben:您只能在数据并行应用程序中获得这种性能。一般的顺序操作是一个完全不同的球赛。(这只是该芯片上的所有 1600 个内核并行运行,一遍又一遍地运行基本相同的指令......即使这是理论上的而不是实际的性能) (2认同)

Joh*_*son 40

CPU 就像一个超级快速的工人。GPU 就像一组快速运行的克隆工人,但它们都必须完全一致地做同样的事情(除了如果你愿意,你可以让一些克隆闲置)

作为开发人员,您更愿意拥有哪一个,一个超级快的人,还是 100 个实际上没有那么快但都必须同时执行相同操作的快速克隆?

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

对于某些操作,克隆人会发臭,例如编写每周报告 - 除了一个克隆人之外的所有克隆人都闲着,而一个克隆人则在写报告(否则你只会得到 100 份相同的报告)。

  • @Kevin:是的,但是您需要一台*同时* CPU *和* GPU 的计算机!要是有这种东西就好了! (24认同)
  • 我什至可以……两者都有吗? (4认同)
  • 很好的比喻。会记住这个。 (4认同)

Pho*_*shi 24

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

您的 CPU 可以比您的 GPU 更快地计算散列 - 但是您的 CPU 完成它所花费的时间,您的 GPU 可能会部分处理数百个散列。GPU 被设计成同时做很多事情,而 CPU 被设计成一次做一件事,但速度非常快。

问题在于,CPU 和 GPU 是解决非常不同的问题的非常不同的解决方案,存在一些重叠,但通常它们域中的内容仍然存在于它们的域中。我们不能用 GPU 代替 CPU,因为 CPU 比 GPU 做得更好,仅仅因为 GPU 不是为完成这项工作而设计的,而 CPU 是。

不过,有一点要注意,如果可以报废 CPU 而只有 GPU,您不认为我们会重命名它吗?:)


jkj*_*jkj 15

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

GPU只是显卡的专用CPU。我们借给 GPU 非图形计算是因为通用 CPU 在并行和浮点执行方面达不到标准。

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

  • 我猜最后一行,因为它完全是错误的。事实上,我只能想到一个只有 x86 的主流操作系统;甚至那个已经被移植到 alpha 和 ARM 处理器,只是目前没有商业提供。 (3认同)

Law*_*ceC 12

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

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

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

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

我一直认为 GPU 执行单元的本意类似于 Playstation 3“SPE”,它们希望获得一个数据块,在其上运行许多顺序操作,然后吐出另一块数据数据,冲洗,重复。它们没有主“CPE”那么多的可寻址内存,但其想法是将每个“SPE”专用于特定的顺序任务。一个单元的输出可能会供给另一个单元的输入。

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

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

如果某些东西不适合这种“流”模型,那么您的任务就不能有效地并行化,而 GPU 不一定是它的最佳解决方案。一个很好的例子是处理基于“外部事件”的东西,比如键盘、操纵杆或网络输入。不适合该模型的东西并不多,但总会有一些。


小智 7

这与时钟速度或目的无关。他们都同样能够完成大多数(如果不是全部)任务;然而,有些比其他任务更适合某些任务。

关于拥有大量哑核还是一小群非常智能的核更好,一直存在一个非常古老的争论。这很容易回到 80 年代。

在 CPU 内部,可以进行许多可能的计算。更智能的内核能够同时执行许多不同的计算(有点像多核,但不是,它很复杂;请参阅指令级并行性)。一个智能内核可以同时进行多项计算(加、减、乘、除、内存操作),但一次只能进行一项;正因为如此,它们在物理上比笨重的内核更大(因此更昂贵)。

一个哑核要小得多,因此可以在单个芯片中添加更多,但不能同时进行许多计算。许多哑核和少数智能核之间存在良好的平衡。

多核架构与图形配合得很好,因为计算可以很容易地分散到数百个核上,但这也取决于代码的质量以及其他代码是否依赖于一次计算的结果。

这是一个很多比它可能会出现更复杂的问题。有关更多信息,请阅读这篇关于 CPU 设计的文章:

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

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

  • 我已经为你修复了它,并添加了一个链接。 (2认同)

And*_*ely 6

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

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


dmc*_*ten 5

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

区别在于它们如何安装在板上以及赋予它们什么任务。当然,我们使用一个通用处理器(或一组通用处理器)作为主数据移动器,并使用一个特殊的、并行化的、深度流水线的单元(如图形)来最好地利用它们。

大多数用于使 GPU 快速运行的漂亮技巧最初是由试图制造更快更好 CPU 的人们开发的。事实证明,Word、Excel 和 Netscape 以及人们使用计算机的许多其他东西不仅没有充分利用图形专用芯片提供的功能,而且在这些架构上运行速度甚至更慢,因为分支很多(非常昂贵)和慢)管道畅通。