【问题标题】:Is it fair to compare SSE/AVX units to GPU cores?将 SSE/AVX 单元与 GPU 内核进行比较是否公平?
【发布时间】:2013-06-29 21:28:42
【问题描述】:

我要向那些(几乎)不知道 GPU 工作原理的人做一个演示。我认为说 GPU 有 1000 个内核而 CPU 只有 4 到 8 个内核是无稽之谈。但我想给我的观众一个比较的元素。

在使用 NVidia 的 Kepler 和 AMD 的 GCN 架构几个月后,我很想将 GPU“核心”CPU 的 SIMD ALU 进行比较(我不不知道他们在英特尔是否有这个名字)。 公平吗?毕竟,在查看汇编级别时,这些编程模型有很多共同点(至少对于 GCN,看看 p2-6 ISA manual)。

This article 声明 Haswell 处理器每个周期可以执行 32 次单精度操作,但我想有流水线或其他事情发生以实现该速率。 用 NVidia 的说法,这个处理器有多少个 Cuda-cores 我会说每个 CPU 核心有 8 个用于 32 位操作,但这只是基于SIMD 宽度。

当然,在比较 CPU 和 GPU 硬件时还需要考虑许多其他因素,但这不是我想要做的。我只需要解释一下它是如何工作的。

PS:非常感谢所有指向 CPU 硬件文档或 CPU/GPU 演示文稿的指针!

编辑: 感谢您的回答,遗憾的是我只能选择其中之一。我标记了Igor's answer,因为它最符合我最初的问题,并给了我足够的信息来证明为什么这个比较不应该走得太远,但是CaptainObvious provided very good articles

【问题讨论】:

标签: cuda hardware opencl gpu sse


【解决方案1】:

我会非常谨慎地进行这种比较。毕竟,即使在 GPU 世界中,“核心”一词也因上下文而异:新的 AMD GCN 与旧的 VLIW4 完全不同,旧的 VLIW4 本身与 CUDA 核心完全不同。
除此之外,如果你和 CPU 做一个小小的比较,你会给你的听众带来更多的困惑而不是理解,仅此而已。如果我是你,我仍然会进行更详细(仍然可以快速)的比较。
例如,一个习惯使用 CPU 并且对 GPU 知之甚少的人可能想知道为什么 GPU 如此昂贵(在 CPU 世界中)却可以拥有如此多的寄存器。在post 的末尾给出了对该问题的解释,以及更多 GPU 与 CPU 的比较。

另一个article 很好地比较了这两种处理单元,解释了 GPU 的工作原理,以及它们如何演变并展示了与 CPU 的差异。它涉及数据流、内存层次结构等主题,还涉及 GPU 对哪些应用程序有用。毕竟,GPU 可以开发的所有功能只能(有效地)用于某些类型的问题。
就我个人而言,如果我不得不做一个关于 GPU 的演示并且有可能只提到 CPU,那就是:展示 GPU 可以有效解决的问题与 CPU 可以更好地处理的问题.
作为奖励,即使它与您的演示文稿没有直接关系,这里有一个article,它使 GPGPU 具有透视性,表明某些人声称的某些加速被高估了(这与我的最后一点有关 :))

【讨论】:

  • +1 指出 GPGPU 的性能经常被夸大。
  • +1,谢谢!我没有将您的答案设置为已接受,因为我希望获得更多反馈,并且可能在 SSE/AVX 硬件上获得一些精度。我肯定会指出,这些疯狂的加速通常是 CPU 优化不佳的一个指标。
  • @CaptainObvious,英特尔的文章值得一读,但具有高度误导性。他们取了 14 个樱桃采摘内核的平均加速比,其中许多内核对 SIMD 不太友好,然后取平均性能,声称 GPU 的加速比仅为 2.5。取平均值是荒谬的! GPU 不像 CPU 那样是通用设备。像任何工具一样,您需要知道它在哪里最有用。尽管声称使用 GPU 可将性能提升 50-100 倍也是荒谬的,但对于许多 SIMD 友好算法而言,GPU 的速度要快一个数量级。
  • 另外,我不明白英特尔声称的一些数字。他们说他们在 GTX 280 上获得了大约 66% 的峰值触发器,但他们的 SGEMM 表有 360 Gflops/s,根据wikipedia,GTX280 的峰值 Gflops/s 是 933.120。这仅是峰值的 39% 左右。也许他们没有像他们声称的那样使用针对 GPU 优化的 SGEMM 算法。至少在 GK110 上可以达到 70% 以上的峰值。
  • @redrum,我不太同意你的两个说法。首先,我不认为这是高度误导。我同意平均值没有任何意义,例如一个范围会更合适(尤其是在结论中)。然而,他们详细说明了所有的加速,分析了这些数字的原因。
【解决方案2】:

我完全同意 CaptainObvious 的观点,尤其是展示 GPU 可以有效解决的问题与 CPU 可以更好地处理的问题将是一个好主意。

我喜欢比较 CPU 和 GPU 的一种方法是通过它们可以执行的操作/秒数。但当然不要将一个 cpu 核心与一个多核 gpu 进行比较。

一个 SandyBridge 内核可以执行 2 个 AVX 运算/周期,即处理 8 个双精度数字/周期。因此,具有 16 个 Sandy-Bridge 内核、时钟频率为 2.6 GHz 的计算机的峰值功率为 333 Gflops。

一个K20计算模块GK110的峰值是1170 Gflops,是3.5倍。在我看来,这是一个公平的比较,应该强调的是,在 CPU 上(某些应用程序达到峰值的 80%-90%)比在 GPU 上(最佳情况)更容易达到峰值性能我知道是less than 50% of peak)。

因此,总结一下,我不会深入讨论架构细节,而是陈述一些切变数,并认为 GPU 上的峰值通常遥不可及。

【讨论】:

  • 在 GPU 上获得峰值性能并不像您声称的那么糟糕。请参阅此链接,显示 SGEMM 的 Nvidia 和 AMD 的峰值性能。英伟达获得超过 70% 的份额。 anandtech.com/show/6774/… 随着算法的改进,这些数字会随着时间的推移而提高。
  • 此外,对于大多数应用程序而言,由于 FMA3 而导致的 Haswell 峰值 FLOPs/s 不会自动翻倍。应用程序要么必须使用更宽松的浮点模型重新编译,要么必须更改代码以直接实现 FMA3 指令。这意味着许多应用程序已经低于 Haswell 峰值的 50%。
  • 我在这里只为 SandyBridge 发言,因为我还没有机会与 Haswell 合作。这里的加倍是由于 2 个向量单元能够同时在独立向量寄存器上进行计算。这个数字来自我自己的程序 :) 感谢您的链接 70% 的情况越来越好。
  • 哪台电脑有16个沙桥核心,你的意思是两个8核Xeon(4650L)处理器?这将花费相当多的成本(主板和两个处理器)。更好的指标是 FLOPs/s/USD。
【解决方案3】:

很笼统地说,说一个 Haswell 内核有大约 16 个 CUDA 内核并不是完全没有道理的,但你绝对不想把这个比较过分。您可能希望谨慎地在演示文稿中直接发表该声明,但我发现将 CUDA 核心视为与标量 FP 单元有些相关是很有用的。

如果我解释一下为什么 Haswell 可以每个周期执行 32 次单精度运算可能会有所帮助。

  • 8 个单精度运算在每个 AVX/AVX2 指令中执行。在编写将在 Haswell CPU 上运行的代码时,您可以使用在 256 位向量上运行的 AVX 和 AVX2 指令。这些 256 位向量可以表示 8 个单精度浮点数、8 个整数(32 位)或 4 个双精度浮点数。

  • 每个内核每个周期可以执行 2 条 AVX/AVX2 指令,但对可以配对的指令有一些限制。

  • 融合乘加 (FMA) 指令在技术上执行 2 个单精度运算。 FMA 指令执行“融合”操作,例如 A = A * B + C,因此可以说每个标量操作数有两个操作:乘法和加法。

本文更详细地解释了以上几点:http://www.realworldtech.com/haswell-cpu/4/

在总记账中,一个 Haswell 核心每个周期可以执行 8 * 2 * 2 次单精度运算。由于 CUDA 内核也支持 FMA 操作,因此在将 CUDA 内核与 Haswell 内核进行比较时,您不能计算 2。

Kepler CUDA 内核有一个单精度浮点单元,因此每个周期可以执行一个浮点运算:http://www.nvidia.com/content/PDF/kepler/NVIDIA-Kepler-GK110-Architecture-Whitepaper.pdf, http://www.realworldtech.com/kepler-brief/

如果我把幻灯片放在一起,我会用一节解释 Haswell 每个周期可以执行多少 FP 操作:上面的三点,再加上你有多个内核和可能的多个处理器。而且,我将在另一部分解释 Kepler GPU 每个周期可以执行多少次 FP 操作:每个 SMX 192 次,并且 GPU 上有多个 SMX 单元。

PS.:我说的可能很明显,但只是为了避免混淆:Haswell 架构还包括一个集成 GPU,它的架构与 Haswell CPU 完全不同。

【讨论】:

  • haswell 真的能以持续的速度在每个周期执行两次 FMA 吗?
  • 其实我可能误解了你的问题。我不知道在实践中是否可以在 Haswell 上实现峰值 FLOPs/s 的翻倍。我希望 MKL 已经支持它,因此这是测试它的好方法(即,对大型矩阵运行 SGEMM 并查看 FLOPs/s 是多少)。
【解决方案4】:

将 GPU 与矢量化 CPU 单元进行比较更为公平,但是如果您的听众对 GPU 的工作原理有的概念,那么假设他们对矢量化 SSE 指令有类似的了解似乎是公平的。

对于这类受众来说,指出高层次的差异很重要,例如 gpu 上的“核心”块如何共享调度程序和寄存器文件。

我会参考GTC Kepler architecture overview 以更好地了解 Kepler 架构的外观。 如果您想坚持“gpu core”的想法,This 也是两者之间的合理比较。

【讨论】:

  • 他们确实了解矢量化 SSE 指令。至少在软件层面。这也是我想在 CPU-SIMD 和 GPU 之间进行比较的部分原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-19
  • 2012-03-02
  • 2019-04-15
  • 1970-01-01
  • 1970-01-01
  • 2015-03-22
  • 1970-01-01
相关资源
最近更新 更多