我自己编写了 CUDA 内核。与 CPU 代码相比,我的内核代码比 CPU 快 10 倍。
但我对我的实验有疑问。
我的程序是否使用所有 GPU 内核、适当的共享内存使用、足够的寄存器数量、足够的占用率进行了充分优化?
如何评估我的内核代码的性能?
理论上如何计算CUDA的最大吞吐量?
我对 CPU 的 GFLOPS 和 GPU 的 GFLOPS 和 GFLOPS 速率之间的比较是它们的透明理论性能是对的吗?
提前致谢。
我自己编写了 CUDA 内核。与 CPU 代码相比,我的内核代码比 CPU 快 10 倍。
但我对我的实验有疑问。
我的程序是否使用所有 GPU 内核、适当的共享内存使用、足够的寄存器数量、足够的占用率进行了充分优化?
如何评估我的内核代码的性能?
理论上如何计算CUDA的最大吞吐量?
我对 CPU 的 GFLOPS 和 GPU 的 GFLOPS 和 GFLOPS 速率之间的比较是它们的透明理论性能是对的吗?
提前致谢。
我的程序是否使用所有 GPU 内核、适当的共享内存使用、足够的寄存器数量、足够的占用率进行了充分优化?
要找出这一点,您可以使用其中一个 CUDA 分析器。查看您如何分析和优化 CUDA 内核?
理论上如何计算CUDA的最大吞吐量?
这个数学有点复杂,每个架构都不同,很容易出错。最好在芯片规格中查找数字。Wikipedia 上有针对 GTX500 卡的表格,例如这张表格。例如,从表中可以看出,GTX580 的理论峰值带宽为 192.4GB/s,计算吞吐量为 1581.1GFLOPs。
我对 CPU 的 GFLOPS 和 GPU 的 GFLOPS 和 GFLOPS 速率之间的比较是它们的透明理论性能是对的吗?
如果我理解正确,您是在询问 GPU 上的理论峰值 GFLOP 数量是否可以直接与 CPU 上的相应数量进行比较。比较这些数字时需要考虑一些事项:
较旧的 GPU 不支持双精度 (DP) 浮点,仅支持单精度 (SP)。
与 SP 相比,支持 DP 的 GPU 会显着降低性能。我上面引用的 GFLOPs 数字是针对 SP 的。另一方面,为 CPU 引用的数字通常是针对 DP 的,在 CPU 上 SP 和 DP 的性能差异较小。
CPU 报价可以用于仅在使用 SIMD(单指令,多数据)矢量化指令时才能实现的速率,并且通常很难编写可以接近理论最大值的算法(并且它们可能必须以汇编形式编写)。有时,CPU 报价是针对通过不同类型指令可用的所有计算资源的组合,并且通常几乎不可能编写可以同时利用它们的程序。
为 GPU 引用的速率假设您有足够的并行工作使 GPU 饱和,并且您的算法不受带宽限制。
性能的首选度量是经过的时间。GFLOP 可以用作比较方法,但由于指令集、编译器代码生成和计算 FLOP 的方法的差异,通常难以在编译器和体系结构之间进行比较。
最好的方法是对应用程序的性能进行计时。对于 CUDA 代码,您应该对每次启动将发生的所有代码进行计时。这包括内存副本和同步。
Nsight Visual Studio Edition 和 Visual Profiler 为每个操作提供最准确的测量。Nsight Visual Studio Edition 为每个设备提供理论带宽和 FLOPs 值。此外,Achieved FLOPs 实验可用于捕获单精度和双精度的 FLOP 计数。