问题 如何量化C内核的CUDA设备的处理权衡?


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

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


7722
2018-05-26 10:38


起源

为了获得最佳性能,您需要针对不同的GPU配置调整代码。 - Paul R
从维基百科告诉我的情况来看,680的内存BW并不比480的内存BW高很多。所以如果你受内存限制,你就不会看到太多的加速。但我无法解释为什么你会看到减速。 - Oliver Charlesworth
您使用的是那个版本的CUDA工具包吗? - geek
我部署了最新版本:4.2.9 - Gearoid Murphy
这段代码使用什么样的操作?大多数是整数或浮点数,如果是后者,单精度还是双精度? - talonmies


答案:


不完全是你的问题的答案,但一些信息可能有助于理解GK104(开普勒,GTX680)与GF110(费米,GTX580)的性能:

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

从晶体管数量来看,GF110拥有30亿个晶体管,而GK104拥有35亿个晶体管。因此,即使开普勒拥有3倍的内核,它只有更多的晶体管。所以现在,开普勒不仅比Fermi只有50%的“费米等效核心”,而且每个核心必须比费米更简单。

因此,这两个问题可能解释了为什么许多项目在移植到开普勒时会看到减速。

此外,GK104是用于显卡的Kepler版本,其调整方式使得线程之间的协作比Fermi慢(因为这种协作对于图形来说并不重要)。考虑到上述事实后,任何潜在的潜在绩效收益都可能被否定。

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


9
2018-05-28 05:09



很好的信息,谢谢。 - Gearoid Murphy
在GK104上,一些整数性能(包括移位,比较和乘法)也要慢得多。同时输入转化次数。请参阅CUDA C编程指南4.2版的表5-1(第74页)。计算能力3.0是GK104。注意单精度浮点运算的比例。 2012年第四季度的GK110修复了其中的许多,并且是“真正的”下一代特斯拉部分。 - Peter
@Peter:谢谢您提供的信息。在我看来,所有这些真正表明的是GK104从未打算作为计算部件。不过,该芯片正在进入特斯拉卡片K10。除非显卡版本在某种程度上受到阻碍,否则这对我来说没有多大意义。有加速,但只有与核心用作着色器(图形)时使用的算法非常类似的算法。 - Roger Dahl
IMO,GK104代表了一个令人遗憾的事实,那就是首先从Fermi开始的图形和计算之间的分离现在已经开始认真。我认为GF110是最后一款可以从显卡获得一流计算性能的芯片。 (除了人为蹒跚的DP表现)。 NVIDIA在围绕GPU的计算能力建立科学社区方面取得了惊人的成功,这得益于那里可用的每美元的翻牌数量。现在,NVIDIA将尝试将社区转移到更有利于NVIDIA的GPU。 - Roger Dahl


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

  1. 使用warp vote函数代替共享内存通信;
  2. 增加一些胎面花纹块并减少一个花纹块的数量;
  3. 优化全球负荷/商店。开普勒每个SMX有32个加载/存储模块(比开普勒多两倍)。

2
2018-05-26 12:26



@Pedro SMX是缩写。 NVidia称下一代SM设计为SMX。请参见 NVidia白皮书。投票功能可以帮助交换/共享某些值,而无需将其存储在共享内存中。例如,您可以实现减少而不使用共享内存。 - geek
这个答案有点令人困惑。为了清晰起见,你能稍微扩展一下吗? - Pedro


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

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

DX11还具有细分功能,因此您希望覆盖它并缩放原始分辨率。 您的原始分辨率可以通过渲染较低的960-540P来实现,并让3D管道完成其余工作以扩展到完整的高清(在nv控制面板桌面大小和位置)。现在使用显示器将较低分辨率缩放到全屏,并且你拥有全高清,动态渲染的纹理大小的两倍,并且一切都应该很好地渲染具有极端LOD偏差(细节水平)的3D纹理。您的显示器需要自动变焦!

此外,你可以击败sli配置计算机。这样我在tessmark中获得的分数高于3-sli。像AAX混合样品这样的高AA设置使得它看起来像AAA质量的高清(在tessmark和heavyon benchies中)。 endcore中没有分辨率设置,因此显示渲染原始分辨率并不重要!

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


2
2017-10-24 00:58





我认为问题可能在于数量 流式多处理器: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 编译时的命令行。


1
2018-05-26 11:42



几乎可以肯定是内存带宽问题,我重构了一些内核以减少内存开销,性能差异缩小到只有几个百分点。 - Gearoid Murphy
@GearoidMurphy:好的,但您可能仍想尝试重新构建块和代码以利用> 3x内核数。 - Pedro