我自己编写了CUDA内核。 与CPU代码相比,我的内核代码比CPU快10倍。
但我对我的实验有疑问。
我的程序是否完全使用所有GPU内核进行优化,使用适当的共享内存,足够的寄存器数量,足够的占用率?
如何评估内核代码的性能?
如何从理论上计算出CUDA的最大吞吐量?
我是对的,比较CPU的GFLOPS和GPU的GFLOPS和GFLOPS率是否具有透明的理论性能?
提前致谢。
答案 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计数。