【问题标题】:Understanding counters in CUDA profiler了解 CUDA 分析器中的计数器
【发布时间】:2013-01-28 17:51:43
【问题描述】:

我在理解 CUDA 分析器中的 sm_cta 计数器时遇到了困难。我正在启动 128 个块,我的启动绑定配置是 __launch_bounds(192,8),但探查器显示特定运行的 133。我对应用程序进行了多次分析,但每次都在 133 左右。这个计数器表示什么?使用 Tesla C2075,Linux 32 位。

【问题讨论】:

  • 您使用的是哪个 cuda 版本?如果你使用 sm_cta_launched 计数器,你会得到什么?

标签: cuda


【解决方案1】:

NVIDIA GPU 在芯片的多个位置都有性能监控单元。在 Fermi 设备上,sm_cta_launched 信号由 GPC 监视器而不是 SM 监视器收集。 Fermi GPC 性能监视器仅限于观察每个 GPC 1 个 SM。 C2075 有 4 个 GPC 和 14 个 SM。 C2075 可以配置 2 个 GPC 和 4 个 SM 和 2 个 GPC 和 3 个 SM。 CUDA 分析器将为每个 GPC 收集 1 个 SM 的计数器,并将结果乘以 GPC 中的 SM 数。最终值可以高于或低于预期值。例如:

GPC     SMs     Counter Value
0       4       8       32
1       4       8       32
2       3       11      33
3       3       12      36
---------------------------
                       133

在文档Compute Command Line Profiler 中,此信息在 countermodeaggregate 选项下指定。

反模式聚合

如果选择此选项,则聚合计数器值将是 输出。对于 SM 计数器,计数器值是计数器的总和 来自所有 SM 的值。对于 l1*、tex*、sm_cta_launched、 uncached_global_load_transaction 和 global_store_transaction 计数器 从每个 GPC 收集 1 个 SM 的计数器值,它是 外推到所有 SM。仅 CUDA 支持此选项 具有 2.0 或更高计算能力的设备。

使用 warps_launched 可以获得更准确的值,该值是使用以下公式为每个 SM 收集的:

thread_blocks_launched = warps_launched
    / ((threadblocksizeX * threadblocksizeY * threadblocksizeZ) + WARP_SIZE - 1)
    / WARP_SIZE

    where WARP_SIZE is 32 on all current devices.

注意:这种方法不适用于动态并行。

【讨论】:

    【解决方案2】:

    一些 CUDA 库函数也在内部使用内核实现,因此执行的块总数略高于您自己显式启动的块数也就不足为奇了。

    【讨论】:

    • 怎么会稍微多一点?我正在启动 128 个区块,我有 14 个 SM,但计数器仍然显示 sm_Cta =133..
    • 您还调用了哪些其他 CUDA 函数?其中一些还启动块。
    • 但是 133 远远超过 8 不是吗?而且我确定我没有使用任何启动这么多线程的库..
    • 我相信计数器 sm_cta 可能是在计算启动的块总数,而不是在 sm0 上启动的块数,所以我认为@tera 给出的答案是有道理的。您可能正在调用其他一些函数,这些函数会在您的应用程序中的 128 个块和总共 133 个块之间产生差异。我在 cuda5 上使用 sm_cta_launched 进行了分析,这就是我所看到的。
    猜你喜欢
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 2011-01-26
    • 2011-05-01
    相关资源
    最近更新 更多