我最近从GTX480升级到GTX680,希望在我的CUDA代码中,三倍数量的内核会显示出显着的性能提升。令我惊恐的是,我发现我的内存密集型CUDA内核在GTX680上运行速度慢了30%-50%。
我意识到这不是一个严格的编程问题,但它直接影响CUDA内核在不同设备上的性能。任何人都可以深入了解CUDA设备的规格,以及如何使用它们来推断它们在CUDA C内核上的性能?
我最近从GTX480升级到GTX680,希望在我的CUDA代码中,三倍数量的内核会显示出显着的性能提升。令我惊恐的是,我发现我的内存密集型CUDA内核在GTX680上运行速度慢了30%-50%。
我意识到这不是一个严格的编程问题,但它直接影响CUDA内核在不同设备上的性能。任何人都可以深入了解CUDA设备的规格,以及如何使用它们来推断它们在CUDA C内核上的性能?
不完全是你的问题的答案,但一些信息可能有助于理解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双精度性能好得多。
新Kepler架构的一个进步是1536个核心,分为8个192核心SMX,但同时这个核心数量是一个大问题。因为共享内存仍然限制在48 kb。因此,如果您的应用程序需要大量SMX资源,那么您无法在单个SMX上并行执行4个warp。您可以对代码进行分析,以找到GPU的真实占用情况。改善应用程序的可能方法:
我正在安装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中没有分辨率设置,因此显示渲染原始分辨率并不重要!
这应该给你一些真实的结果,所以请仔细阅读文学。
我认为问题可能在于数量 流式多处理器: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
编译时的命令行。