【问题标题】:Why do GPU based algorithms perform faster为什么基于 GPU 的算法执行得更快
【发布时间】:2012-02-11 08:48:38
【问题描述】:

我刚刚在 GPU 上实现了一个算法,它计算数组的连续索引的差异。我将它与基于 CPU 的实现进行了比较,发现对于大型阵列,基于 GPU 的实现执行得更快。

我很好奇为什么基于 GPU 的实现执行得更快。请注意,我知道 GPU 具有多个内核并因此可以并行执行操作的表面推理,即,我们可以分配一个线程来计算每个索引的差异,而不是顺序访问每个索引。

但是谁能告诉我为什么 GPU 的性能更快的更深层次的原因。他们的架构有什么不同,以至于他们可以击败基于 CPU 的实现

【问题讨论】:

  • 这是一个“一根绳子有多长?”问题——没有单一的答案。什么算法?什么显卡?什么CPU?对于您的微不足道的示例,内核的内存带宽有限,因此答案可能是“您的 GPU 的内存带宽比您的 CPU 多”。
  • 这有点像问,“为什么公共汽车比汽车载更多的人(类似于带宽)?请注意,我已经知道一辆公共汽车有几个座位,因此可以载多个人同一时间,但谁能告诉我更深层次的原因,为什么他们可以承载更多的人?”嗯,他们载更多的人,因为,嗯,他们载更多的人......
  • @talonmies:内存带宽受限是什么意思?请帮忙
  • 顾名思义,内存带宽受限意味着代码的整体性能受限于设备内存的最大吞吐量。 GPU 的内存吞吐量是性能瓶颈。

标签: cuda gpgpu nvidia


【解决方案1】:

一般来说,它们的执行速度并不快。

重点是:有些算法更适合 CPU,有些算法更适合 GPU。

GPU 的执行模型不同(参见 SIMD)、内存模型不同、指令集不同……整个架构不同。

没有明显的方法可以比较 CPU 和 GPU。您只能讨论算法的 CPU 实现 A 是否(以及为什么)比该算法的 GPU 实现 B 更快或更慢。


这最终有点模糊,所以具体原因的冰山一角是:CPU 的强项是随机内存访问、分支预测等。GPU 擅长于高数据局部性的大量计算,以便您的实现可以实现计算与内存访问的良好比率。 SIMD 使 GPU 实现比 CPU 慢,例如,在许多代码路径中存在大量不可预测的分支。

【讨论】:

    【解决方案2】:

    真正的原因是 GPU 不仅有几个核心,而且还有许多核心,通常有数百个!然而,每个 GPU 内核都比低端 CPU 慢得多。

    但是编程模式根本不像多核CPU。因此,大多数程序无法移植到 GPU 或从 GPU 中受益。

    【讨论】:

      【解决方案3】:

      虽然这里已经给出了一些答案并且这是一个旧线程,但我只是想我会为后代添加这个而不是什么:

      CPU 和 GPU 在某些问题上的性能差异如此之大的主要原因是关于如何分配芯片资源的设计决策。 CPU 将其大部分芯片空间用于大型高速缓存、指令解码器、外围设备和系统管理等。它们的内核要复杂得多,并且以更高的时钟频率运行(这会产生更多必须消散的每个内核的热量。)相比之下, GPU 将他们的芯片空间用于尽可能多地在芯片上封装浮点 ALU。 GPU 的最初目的是尽可能快地乘以矩阵(因为这是图形渲染中涉及的主要计算类型。)因为矩阵乘法是一个令人尴尬的并行问题(例如,每个输出值的计算完全独立于其他每个输出值) 并且每个计算的代码路径都是相同的,因此可以通过让多个 ALU 遵循由单个指令解码器解码的指令来节省芯片空间,因为它们都同时执行相同的操作。相比之下,每个 CPU 内核都必须有自己独立的指令解码器,因为这些内核不遵循相同的代码路径,这使得 CPU 的每个内核在芯片上都比 GPU 的内核大得多。由于在矩阵乘法中执行的主要计算是浮点乘法和浮点加法,因此 GPU 的实现使得它们中的每一个都是单周期操作,实际上,甚至包含将两个相乘的融合乘加指令数字并将结果添加到单个循环中的第三个数字。这比典型的 CPU 快得多,后者的浮点乘法通常是一个多周期操作。同样,这里的权衡是芯片空间专门用于浮点数学硬件,其他指令(例如控制流)通常每个内核比 CPU 慢得多,有时甚至不存在于 CPU 上。完全是 GPU。

      此外,由于 GPU 内核的时钟频率比典型的 CPU 内核低得多,并且不包含那么多复杂的电路,因此它们不会在每个内核中产生那么多热量(或每个内核使用尽可能多的功率)。这允许它们中的更多可以打包到相同的空间中而不会使芯片过热,并且还允许具有 1,000 多个内核的 GPU 具有与仅具有 4 或 8 个内核的 CPU 相似的功率和冷却​​要求。

      【讨论】:

        猜你喜欢
        • 2013-11-21
        • 1970-01-01
        • 2023-04-05
        • 2012-08-10
        • 2012-11-24
        • 1970-01-01
        • 1970-01-01
        • 2012-02-13
        • 2012-06-18
        相关资源
        最近更新 更多