尝试了解 nvprof 指标,sm_efficiency 和 warp_execution_efficiency 为零

use*_*493 5 cuda

我正在尝试了解 nvprof 指标。我是 CUDA 新手,因此试图了解哪些指标对性能很重要。

我编写了一个内核来计算矩阵之间的绝对差之和。

在 Tegra X1 上运行,平均时间约为 47 毫秒,有 1584 个块,每个块有 1024 个线程。

运行 nvprof 我得到这些指标:

achieved_occupancy         Achieved Occupancy         0.982284    0.982284    0.982284
warp_execution_efficiency  Warp Execution Efficiency  0.00%       0.00%       0.00%
sm_efficiency              Multiprocessor Activity    0.11%       0.11%       0.11%
branch_efficiency          Branch Efficiency          100.00%     100.00%     100.00%
ipc                        Executed IPC               3.600738    3.600738    3.600738
Run Code Online (Sandbox Code Playgroud)

当其他指标都这么好时,为什么 和Warp Execution Efficiency却如此低?Multiprocessor Activity在分析内核的总体性能时,这些是需要考虑的正确指标,对吧?

Rob*_*lla 4

这里一个好的答案可能涉及关于 CUDA 执行效率、优化方法和目标以及nvprof. 由于您根本没有提供任何代码,因此它必须是完全抽象和推测的。

如果您正在努力解决nvprofCUDA 优化概念,那么尝试使用可视化分析器可能会更好nvvp,其中包括大量指导分析、解释、帮助和专家系统。

要开始探索您的问题之一,sm_efficiency请参考 SM 具有一个或多个处于活动状态的时间百分比。由于您的sm_efficiency值相当低,因此 SM 整体上大部分时间都处于空闲状态 - 它不发出指令。例如,如果我们将其与占用率进行比较,就会发现它们几乎是正交的概念。占用率粗略地说是指SM 上驻留有多少扭曲。如果SM有“完整的补充”扭曲,那么占用率就会很高。

关于您关于这些是否是“正确的指标”的问题,“正确的指标”应该遵循以下两个轨迹之一:

  1. 验证是否已达到基本优化目标。对于 CUDA,其中最基本的问题涉及充分的并行性和内存子系统的有效使用。例如,您选择的指标都与高效内存使用相关。

  2. 一种分析驱动的优化轨迹,即专注于建立性能限制因素的轨迹。有各种涵盖这些想法的演示文稿,您可以搜索。如果您在 google 上搜索“gtc cuda optimization”,您会发现一些演示文稿很好地揭示了基本 CUDA 优化技术、性能测量和分析驱动的优化。

将此标记为 CW - 其他人可能希望添加他们的想法或最佳实践。