I am currently developing a CUDA application that will most certainly be deployed on a GPU much better than mine. Given another GPU model, how can I estimate how much faster my algorithm will run on it?
2 回答
你会遇到困难,原因有很多:
时钟频率和内存速度与代码速度的关系很微弱,因为几乎所有新硬件都在进行改进/更改的引擎盖下还有很多事情(例如线程上下文切换)。
缓存已添加到新硬件(例如,Fermi)中,除非您对缓存命中/未命中率进行建模,否则您将很难预测这将如何影响速度。
浮点性能通常非常依赖于型号(例如:Tesla C2050 的性能优于“顶级”GTX-480)。
每个设备的寄存器使用情况可能因不同设备而异,这也会影响性能;在许多情况下,入住率会受到影响。
可以通过针对特定硬件来提高性能,因此即使您的算法非常适合您的 GPU,如果您针对新硬件优化它可能会更好。
现在,也就是说,如果您通过其中一个分析器(例如 NVIDIA Compute Profiler)运行您的应用程序,您可能可以做出一些预测,并查看您的占用率和 SM 利用率。如果您的 GPU 有 2 个 SM,而您最终将在其上运行的那个有 16 个 SM,那么您几乎可以肯定会看到改进,但并不是因为这个原因。
因此,不幸的是,要做出您想要的预测类型并不容易。如果您正在编写开源代码,您可以发布代码并要求其他人使用更新的硬件对其进行测试,但这并不总是一种选择。
对于某些硬件更改,这可能很难预测,而对于其他更改则微不足道。 突出显示您正在考虑的两张卡之间的差异。
例如,这种变化可能微不足道——如果我购买了其中一个 EVGA 水冷庞然大物,它的性能会比标准 GTX 580 好多少?这只是计算限制时钟速度(内存或 gpu 时钟)差异的练习。当我想知道我是否应该超频我的卡时,我也遇到了这个问题。
如果您要使用类似的架构,从 GTX 580 到 Tesla C2070,您可以对时钟速度的差异做出类似的情况,但您必须小心单/双精度问题。
如果你正在做一些更激烈的事情,比如从移动卡 - GTX 240M - 到顶级线卡 - Tesla C2070 -那么你可能根本不会获得任何性能提升。
注意:克里斯的回答非常正确,但我想强调这一点,因为我设想了这种常见的工作路径:
一个人对老板说:
- 所以我听说过这个 CUDA 的东西......我认为它可以使功能
X
更加高效。 - 老板说你可以有 0.05% 的工作时间来测试 CUDA——嘿,我们已经有了这张移动卡,用它吧。
- 一年后......所以 CUDA 可以让我们加速三倍。我可以买一张更好的卡来测试一下吗?(一台 GTX 580 只需 400 美元——比那次实习生惨败还便宜……)
- 你花了 $$,买了卡,你的 CUDA 代码运行得更慢了。
- 你的老板现在很生气。你浪费了时间和金钱。
所以发生了什么事?在旧卡上开发,想想 8800、9800,甚至是具有类似 30 核的移动 GTX 2XX,导致人们以与有效利用具有 512 核的卡的方式截然不同的方式优化和设计您的算法。 告诫 Emptor 你得到了你所支付的 - 那些很棒的卡很棒- 但你的代码可能不会运行得更快。
已发出警告,走开消息是什么?当你得到那张更好的卡时,一定要花时间调整、测试,并可能从头开始重新设计你的算法。
好的,也就是说,经验法则?GPU 的速度每六个月提高一倍。因此,如果您要从两年前的卡片升级到顶级卡片,请向您的老板声称它的运行速度将提高 4 到 8 倍(如果您获得了 16 倍的完整改进,那就太好了! !)