11

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

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

4

4 回答 4

9

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

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

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

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

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

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

于 2012-05-28T05:09:29.667 回答
2

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

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

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

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

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

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

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

于 2012-10-24T00:58:26.677 回答
1

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

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

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

于 2012-05-26T11:42:24.200 回答