【问题标题】:How to quantify the processing tradeoffs of CUDA devices for C kernels?如何量化 C 内核的 CUDA 设备的处理权衡?
【发布时间】:2012-06-01 16:35:50
【问题描述】:

我最近从 GTX480 升级到了 GTX680,希望增加三倍的内核数量会在我的 CUDA 代码中体现出显着的性能提升。令我惊恐的是,我发现我的内存密集型 CUDA 内核在 GTX680 上运行速度要慢 30%-50%。

我意识到这不是一个严格的编程问题,但它确实直接影响不同设备上 CUDA 内核的性能。谁能提供一些关于 CUDA 设备的规格以及如何使用它们来推断其在 CUDA C 内核上的性能的见解?

【问题讨论】:

  • 为了获得最佳性能,您确实需要针对不同的 GPU 配置调整代码。
  • 从 Wikipedia 告诉我的情况来看,680 的内存 BW 并不比 480 高多少。因此,如果您受内存限制,则不会看到太多加速。不过,我无法解释为什么您会看到速度放缓。
  • 你用的是那个版本的CUDA工具包?
  • 我部署了最新版本:4.2.9
  • 这段代码使用了什么样的操作?主要是整数或浮点数,如果是后者,是单精度还是双精度?

标签: linux cuda


【解决方案1】:

我认为问题可能在于流式多处理器的数量:GTX 480 有 15 个 SM,GTX 680 只有 8 个。

SM 的数量很重要,因为最多 8/16 个块或 1536/2048 个线程(计算能力 2.0/3.0)可以驻留在单个 SM 上。他们共享的资源,例如共享内存和寄存器,可以进一步限制每个 SM 的块数。此外,GTX 680 上每个 SM 的更多内核数只能通过使用 instruction-level parallelism 来合理利用,即通过流水线处理多个独立操作。

要了解每个 SM 可以同时运行的块数,您可以使用 nVidia 的CUDA Occupancy Calculator 电子表格。要查看内核所需的共享内存和寄存器数量,请在编译时将-Xptxas –v 添加到nvcc 命令行。

【讨论】:

  • 几乎可以肯定是内存带宽问题,我重组了一些内核以减少内存开销,性能差距缩小到只有百分之几。
  • @GearoidMurphy:好的,但您可能仍想尝试重新构建块和代码以利用 >3 倍的内核数。
【解决方案2】:

新 Kepler 架构的一大进步是将 1536 个内核组合成 8 个 192 核 SMX,但同时这个内核数量是一个大问题。因为共享内存仍然限制为 48 kb。因此,如果您的应用程序需要大量 SMX 资源,那么您无法在单个 SMX 上并行执行 4 个 warp。您可以分析您的代码以查找 GPU 的实际占用情况。改进应用程序的可能方法:

  1. 使用 warp vote 函数而不是共享内存通信;
  2. 增加一个花纹块的数量,减少一个花纹块的螺纹数量;
  3. 优化全局加载/存储。 Kepler 为每个 SMX 提供 32 个加载/存储模块(是 Kepler 的两倍)。

【讨论】:

  • @Pedro SMX 是一个缩写。 NVidia 将下一代 SM 设计称为 SMX。请参阅NVidia Whitepaper。投票功能可以帮助交换/共享某些值,而无需将其存储在共享内存中。例如,您可以在不使用共享内存的情况下实现缩减。
  • 这个答案有点混乱。为了清楚起见,您可以扩展一下吗?
【解决方案3】:

不完全是您问题的答案,但一些信息可能有助于了解 GK104(Kepler,GTX680)与 GF110(Fermi,GTX580)的性能:

在 Fermi 上,内核的运行频率是其余逻辑的两倍。在开普勒上,它们以相同的频率运行。如果一个人想要做更多的苹果对苹果与费米相比,这有效地减少了开普勒的核心数量。因此,GK104(开普勒)拥有 1536 / 2 = 768 个“费米等效核心”,仅比 GF110(费米)上的 512 个核心多 50%。

从晶体管数量来看,GF110 有 30 亿个晶体管,而 GK104 有 35 亿个。因此,即使 Kepler 的内核数量是其 3 倍,它的晶体管数量也仅略多一些。所以现在,不仅开普勒的“费米等效核心”比费米多 50%,而且这些核心中的每一个都必须比费米的简单得多。

因此,这两个问题可能解释了为什么许多项目在移植到 Kepler 时会出现放缓。

此外,作为用于显卡的 Kepler 版本,GK104 已经过调整,使得线程之间的协作比在 Fermi 上慢(因为这种协作对于图形来说并不重要)。考虑到上述事实后,任何潜在的潜在性能提升都可能因此而被否定。

还有双精度浮点性能的问题。 Tesla 卡中使用的 GF110 版本可以以 1/2 的单精度性能进行双精度浮点运算。该芯片用于显卡时,双精度性能被人为限制为单精度性能的1/8,但这仍然比GK104的1/24双精度性能好很多。

【讨论】:

  • 一些整数性能,包括移位、比较和乘法,在 GK104 上也慢得多。还有类型转换。请参阅 CUDA C 编程指南 4.2 版的表 5-1(第 74 页)。计算能力3.0是GK104。注意与单精度浮点运算的比率。 GK110 将于 2012 年第 4 季度推出,修复了其中的许多问题,是“真正的”下一代特斯拉部件。
  • @Peter:感谢您提供的信息。在我看来,这一切真正表明 GK104 从未打算用作计算部件。尽管如此,该芯片仍在进入特斯拉卡 K10 中。除非显卡版本以某种方式受到影响,否则这对我来说没有多大意义。有一些加速,但仅限于与内核用作着色器(用于图形)时所使用的算法非常相似的算法。
  • IMO,GK104 代表了一个可悲的事实,那就是最初由 Fermi 开始的图形和计算之间的分离现在已经正式开始。我认为 GF110 是最后一款可以从显卡获得顶级计算性能的芯片。 (除了人为阻碍的 DP 性能)。 NVIDIA 在围绕其 GPU 的计算能力建立一个科学社区方面取得了惊人的成功,这取决于那里每美元可用的失败次数。现在,NVIDIA 将尝试将社区转移到对 NVIDIA 来说更有利可图的 GPU。
【解决方案4】:

我正在安装 nvieuw,并使用coolbits 2.0 将您的着色器核心从默认状态解锁到最高性能。此外,您必须将设备的两个连接器都连接到 1 个显示器,这可以在 nVidia 控制面板屏幕 1/2 和屏幕 2/2 中启用。现在你必须克隆这个屏幕与另一个,Windows分辨率配置设置屏幕模式为扩展桌面。

使用 nVidia 检查器 1.9(BIOS 级驱动程序),您可以通过为应用程序设置配置文件来激活此模式(您需要将应用程序的 exe 文件添加到配置文件中)。现在您的性能几乎翻了一番(注意温度)。

DX11 还具有曲面细分功能,因此您希望覆盖它并缩放您的原始分辨率。 您可以通过渲染较低的分辨率(如 960-540P)来实现您的原始分辨率,然后让 3D 管道完成其余工作以放大到全高清(在 nv 控制面板桌面大小和位置中)。现在将较低的分辨率缩放到带显示的全屏,您将获得全高清和双倍纹理大小的动态渲染,一切都应该适合渲染具有极端 LOD 偏差(细节级别)的 3D 纹理。您的显示器需要自动缩放!

此外,您还可以击败 sli config 计算机。这样我在 tessmark 中得到的分数比 3-way sli 高。像 32X 混合样本这样的高 AA 设置使 al 看起来像 AAA 质量的高清(在 tessmark 和 heavon benchies 中)。 endscore 中没有分辨率设置,这表明渲染原始分辨率并不重要!

这应该会给你一些真实的结果,所以请仔细阅读而不是文学。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 2016-02-15
    • 2012-06-15
    • 2013-03-23
    • 2014-02-21
    • 2014-06-21
    相关资源
    最近更新 更多