我在理解 CUDA 分析器中的 sm_cta 计数器时遇到了困难。我正在启动 128 个块,并且我的启动绑定配置是,__launch_bounds(192,8)
但探查器显示 133 用于特定运行。我对应用程序进行了多次分析,但每次都在 133 左右。这个计数器表示什么?使用 Tesla C2075,Linux 32 位。
2 回答
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 进行推断。仅具有计算能力 2.0 或更高版本的 CUDA 设备支持此选项。
使用 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.
注意:这种方法不适用于动态并行。
一些 CUDA 库函数也在内部使用内核实现,因此执行的块总数略高于您自己显式启动的块数也就不足为奇了。