【问题标题】:cpu vs gpu - when cpu is better [closed]cpu vs gpu - 当cpu更好时[关闭]
【发布时间】:2011-08-17 11:18:15
【问题描述】:

我知道很多 GPU 比 CPU 快得多的例子。但是存在很难并行化的算法(问题)。能不能给我一些例子或测试什么时候 CPU 可以胜过 GPU?

编辑:

感谢您的建议!我们可以比较最流行和最新的 cpu 和 gpu,例如 Core i5 2500k 与 GeForce GTX 560 Ti。

我想知道如何比较它们之间的 SIMD 模型。例如:Cuda 更准确地称 SIMD 模型为 SIMT。但是 SIMT 应该与 CPU 上的多线程进行比较,后者在 MIMD 内核之间分配线程(任务)(Core i5 2500k 提供 4 个 MIMD 内核)。另一方面,这些 MIMD 内核中的每一个都可以实现 SIMD 模型,但这与 SIMT 不同,我不知道如何比较它们。最后,可以将具有并发内核执行的 fermi 架构视为具有 SIMT 的 MIMD 内核。

【问题讨论】:

  • 请先阅读this blog post,然后再在 stackoverflow 上提问此类问题。
  • @talonmies:我不同意:这是一个非常具体的问题,有一个非常具体的答案。唯一反对它的是它可能是其他问题的重复。
  • GPGPU vs. Multicore?的可能重复
  • 请参阅 - oxford-man.ox.ac.uk/gpuss/simd.html中的“不良候选人”
  • 我认为这主要是“何时”的问题。给定某个算法的 CPU 和 GPU 实现,什么时候 CPU 版本会更快?当正在处理的数据小到足以在 CPU 上处理的时间少于 GPU 版本将数据传输到 GPU 并处理它所需的时间时,CPU 将更快。因此,在某些情况下,当输入数据非常小时,通常在 GPU 上更快的算法可能在 CPU 上具有更好的性能,因为将数据发送到 GPU 会产生开销。跨度>

标签: cpu gpgpu cpu-architecture


【解决方案1】:

根据我的经验,我将总结 CPU 和 GPU 中并行程序在性能方面的主要差异。相信我,比较可以代代相传。因此,我将指出 CPU 和 GPU 的优点和缺点。当然,如果你制作一个极端的程序,即只有坏的或好的方面,它会在一个平台上运行肯定更快。但是这些的混合需要非常复杂的推理。

主机程序级别

一个关键的区别是内存传输成本。 GPU 设备需要一些内存传输。在某些情况下,此成本并非微不足道,例如当您必须经常传输一些大数组时。以我的经验,这种成本可以降到最低,但会将大部分主机代码推送到设备代码。您可以这样做的唯一情况是当您必须在程序中与主机操作系统交互时,例如输出到监视器。

设备程序级别

现在我们看到了一幅尚未完全揭示的复杂画面。我的意思是GPU中有很多神秘的场景没有被披露。但是,在性能方面,我们仍然有很多区别 CPU 和 GPU(内核代码)。

我注意到很少有因素会显着影响差异。

  • 工作负载分布

GPU 由许多执行单元组成,旨在处理大规模并行程序。如果你的工作很少,比如说几个顺序任务,然后把这些任务放在 GPU 上,那么很多执行单元中只有几个是忙碌的,因此会比 CPU 慢。另一方面,因为 CPU 更适合处理短而连续的任务。原因很简单,CPU 要复杂得多,并且能够利用指令级并行性,而 GPU 则利用线程级并行性。嗯,我听说 NVIDIA GF104 可以做 Superscalar,但我没有机会体验它。

值得注意的是,在 GPU 中,工作负载被分成小块(或 OpenCL 中的工作组),并且块被排列成块,每个块都在一个流处理器中执行(我使用的是 NVIDIA 的术语)。但是在 CPU 中,这些块是按顺序执行的——我想不出除了单个循环之外的任何东西。

因此,对于块数较少的程序,可能在 CPU 上运行得更快。

  • 控制流指令

分支对 GPU 来说总是很糟糕。请记住,GPU 更喜欢平等的东西。相等的块,块内的相等线程和经线内的相等线程。但最重要的是什么?

                            ***Branch divergences.***

Cuda/OpenCL 程序员讨厌分支分歧。由于所有线程都以某种方式分为 32 个线程的集合,称为 warp,并且 warp 中的所有线程都以同步方式执行,因此分支分歧将导致 warp 中的某些线程被序列化。因此,warp 的执行时间将相应地成倍增加。

与 GPU 不同,CPU 中的每个内核都可以遵循自己的路径。此外,由于 CPU 具有分支预测功能,因此可以有效地执行分支。

因此,具有更多 warp 分歧的程序可能在 CPU 上运行得更快。

  • 内存访问说明

这真的很复杂,所以让我们简要介绍一下。

请记住,全局内存访问具有非常高的延迟(400-800 个周期)。所以在老一代的 GPU 中,内存访问是否被合并是一个关键问题。现在你的 GTX560 (Fermi) 有更多的 2 级缓存。所以在很多情况下可以降低全局内存访问成本。但是CPU和GPU中的缓存不同,所以效果也不同。

我可以说的是,它真的取决于你的内存访问模式、你的内核代码模式(内存访问如何与计算交错、操作类型等)来判断一个在 GPU 上运行得更快还是CPU。

但不知何故,您可以预期大量缓存未命中(在 GPU 中)会对 GPU 产生非常糟糕的影响(有多糟糕?- 这取决于您的代码)。

此外,共享内存是 GPU 的一个重要特性。访问共享内存与访问 GPU L1 缓存一样快。因此,使用共享内存的内核将受益匪浅。

我还没有真正提到的其他一些因素,但在许多情况下,它们可能会对性能产生重大影响,例如银行冲突、内存事务大小、GPU 占用率......

【讨论】:

    猜你喜欢
    • 2018-09-10
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 2012-07-03
    • 2023-04-07
    • 2013-09-19
    相关资源
    最近更新 更多