【问题标题】:How to evaluate CUDA performance?如何评估 CUDA 性能?
【发布时间】:2012-08-08 09:46:33
【问题描述】:

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

但我对我的实验有疑问。

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

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

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

比较 CPU 的 GFLOPS 和 GPU 的 GFLOPS 以及 GFLOPS 速率是否是它们的透明理论性能?

提前致谢。

【问题讨论】:

    标签: performance cuda


    【解决方案1】:

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

    要找出这一点,您可以使用其中一个 CUDA 分析器。见How Do You Profile & Optimize CUDA Kernels?

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

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

    比较 CPU 的 GFLOPS 和 GPU 的 GFLOPS 以及 GFLOPS 速率是否是它们的透明理论性能?

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

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

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

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

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

    【讨论】:

    • 我还有一个问题。假设 CPU : 2.8GHz, 1 Core GPU : 1.6GHz, 384 core (GTX 560 Ti Spec) 在这个例子中,CPU 的预期性能是 2.8GHz x 1 core = 2.8GHz·Core GPU 的预期性能是 0.8GHz x 384 core = 307.2 Ghz·Core 这个计算有效吗?
    • 您无法以 GHz 为单位测量性能。要找到理论性能,您必须找出 CPU/GPU 在每个时钟周期内可以做什么。我之前提到的考虑因素会影响您可以获得的性能。例如,如果您正在查看英特尔 Sandy Bridge 的性能,您必须考虑到它有一个称为 AVX 的指令集,每条指令可以执行 8 个 SP 操作。
    • 此外,Sandy Bridge 每个时钟可以运行 2 次 AVX 操作,外加 AVX 加载/存储。所以这表明 2.8GHz * 8 SP/AVX * 2 AVX/时钟 = 44.8GFLOPS/内核。在 8 核芯片上,这将增加 8 * 44.8GFLOPS = 358.4GFLOPS。我没有研究过这些数字,所以对它们持保留态度。我只是添加了这些以显示尝试通过直接将频率乘以内核数量来找到性能的危险。
    • @chaohuang 我没有足够的声誉.. 所以我不能支持这篇文章。回复对我来说还不错。我会接受对我有帮助的回复。
    【解决方案2】:

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

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

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

    【讨论】:

    • 我使用经过的时间来检查 CPU 和 GPU 的性能。我的问题是它们的差异率是 CPU 和 GPU 之间的 10 倍。但是我可以说 10 倍(率)是最好的表现吗?如果是,为什么?如果不是,为什么?这是我的问题..
    猜你喜欢
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多