为何NSight Compute未捕获到程序的CUDA内核启动?
可能的原因及解决办法
- 内核执行时间过短被过滤:NSight Compute默认会忽略执行时间小于1微秒的内核。可以在分析设置中调整过滤阈值:进入
Analysis->Kernel Filtering,将Minimum Duration设为0,或者调整到合适的值,确保短执行时间的内核能被捕获。 - 权限不足(Linux/macOS):在Linux或macOS环境下,访问GPU性能计数器需要特定权限。可以用
sudo启动NSight Compute,或者通过命令行设置内核参数:sysctl -w dev.nvidia.uvm.perf_privilege=1(仅Linux),之后重新运行分析。 - 内核在子进程中执行:如果程序通过
fork等方式创建子进程,并在子进程中启动CUDA内核,NSight Compute默认不会分析子进程的内核。需要在Launch选项卡的Advanced设置中,启用Child Process Analysis选项。 - CUDA与NSight Compute版本不兼容:确保CUDA Toolkit版本和NSight Compute版本匹配。比如NSight Compute 2024.x通常对应CUDA 12.x,旧版本的NSight可能无法正确捕获新版本CUDA的内核执行。
- GPU不支持分析功能:NSight Compute仅支持NVIDIA Kepler架构及以后的GPU。如果GPU是更早的架构(比如Fermi),或者使用的是非NVIDIA集成GPU,则无法进行内核分析。部分低端NVIDIA GPU也可能限制了性能计数器的访问。
- CUDA Graphs未被启用分析:如果内核是通过CUDA Graphs批量启动的,NSight Compute默认不会捕获Graph中的内核。需要在
Analysis设置中启用CUDA Graph Analysis选项,确保Graph内的内核被分析。 - 错误的内核过滤规则:检查
Analysis->Kernel Filtering中的设置,确认是否不小心设置了特定的内核名称过滤,或者排除了某些内核。确保选择的是All Kernels,没有额外的过滤条件。 - 程序提前完成初始化:极少数情况下,如果程序在NSight完成捕获初始化前就执行了内核,会导致无法捕获。可以在程序开头添加短暂的延迟(比如
std::this_thread::sleep_for(std::chrono::seconds(1));),给NSight足够的时间完成捕获准备。
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

