如何评估CUDA性能?

时间:2012-08-11 06:57:31

标签: performance cuda

我自己编写了CUDA内核。 与CPU代码相比,我的内核代码比CPU快10倍。

但我对我的实验有疑问。

我的程序是否完全使用所有GPU内核进行优化,使用适当的共享内存,足够的寄存器数量,足够的占用率?

如何评估内核代码的性能?

如何从理论上计算出CUDA的最大吞吐量?

我是对的,比较CPU的GFLOPS和GPU的GFLOPS和GFLOPS率是否具有透明的理论性能?

提前致谢。

2 个答案:

答案 0 :(得分:5)

  

我的程序是否完全使用所有GPU内核进行优化,使用适当的共享内存,足够的寄存器数量,足够的占用率?

要找到它,请使用其中一个CUDA分析器。见How Do You Profile & Optimize CUDA Kernels?

  

如何从理论上计算出CUDA的最大吞吐量?

这个数学略有参与,每个架构都有所不同,容易出错。最好查看芯片规格中的数字。维基百科上有表格,例如this one, for the GTX500 cards。例如,从表中可以看出,GTX580的理论峰值带宽为192.4GB / s,计算吞吐量为1581.1GFLOP。

  

我是对的,比较CPU的GFLOPS和GPU的GFLOPS和GFLOPS率是否具有透明的理论性能?

如果我理解正确,你问的是GPU上的理论峰值GFLOP数量是否可以直接与CPU上的相应数字进行比较。比较这些数字时需要考虑一些事项:

  • 较旧的GPU不支持双精度(DP)浮点,只支持单精度(SP)。

  • 与SP相比,支持DP的GPU会显着降低性能。我上面引用的GFLOP数字是SP。另一方面,CPU引用的数字通常用于DP,并且CPU上SP和DP的性能差异较小。

  • CPU报价可以是仅在使用SIMD(单指令,多数据)矢量化指令时可实现的速率,并且通常很难编写可接近理论最大值的算法(并且它们可能必须是用汇编写的)。有时,CPU引用是通过不同类型的指令可用的所有计算资源的组合,并且通常几乎不可能编写可以同时利用它们的程序。

  • GPU引用的费率假设您有足够的并行工作来使GPU饱和,并且您的算法不受带宽限制。

答案 1 :(得分:3)

表现的首选衡量标准是经过时间。 GFLOP可以用作比较方法,但由于指令集,编译器代码生成和FLOP计数方法的不同,通常很难在编译器和体系结构之间进行比较。

最好的方法是计算应用程序的性能。对于CUDA代码,您应该为每次启动时发生的所有代码计时。这包括内存复制和同步。

Nsight Visual Studio Edition和Visual Profiler可以为每个操作提供最准确的测量。 Nsight Visual Studio Edition为每个设备提供理论带宽和FLOP值。此外,Achieved FLOPs实验可用于捕获单精度和双精度的FLOP计数。