CUDA 8环境下,如何对含大量共享库的CUDA应用做性能剖析?
我之前在处理多共享库的复杂CUDA应用时,也碰到过nvprof附加进程无输出的糟心事,给你几个经过验证的解决方案:
1. 先解决权限和系统限制问题
很多时候不是nvprof的问题,是系统权限或者安全机制在捣乱:
- 确保你用root用户或者拥有
CAP_SYS_ADMIN权限的用户运行nvprof,附加进程需要调试权限,普通用户经常会被限制。 - 临时关闭SELinux/AppArmor试试(测试用,之后可以再打开):
# SELinux临时关闭 sudo setenforce 0 # AppArmor临时禁用nvprof规则 sudo aa-disable /usr/bin/nvprof - 检查
LD_LIBRARY_PATH是否包含CUDA的库路径,避免nvprof找不到依赖:export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
2. 放弃--profile-all-processes,用精确的进程附加参数
--profile-all-processes对复杂应用的兼容性很差,不如直接指定PID并明确输出选项:
先启动你的应用,拿到进程PID(比如12345),然后运行:
nvprof --attach-pid 12345 --print-gpu-trace --analysis-metrics
如果还是没输出,试试延迟启动分析,手动控制开始/结束:
nvprof --attach-pid 12345 --profile-from-start off --print-gpu-trace
启动后输入start开始分析,执行完你的CUDA逻辑后输入stop,最后quit生成报告,这样能确保你捕获到内核运行的时间段。
3. 直接切换到Nsight Systems(nvprof的官方替代)
NVIDIA已经把nvprof标记为废弃工具了,Nsight Systems对多共享库、动态加载的应用支持好太多,几乎不会出现无输出的情况:
附加到运行中的进程:
nsys profile --pid 12345 -o cuda_perf_report
生成的.qdrep文件可以用Nsight Systems GUI打开,里面能看到CUDA内核的执行时间、SM利用率、内存访问瓶颈等所有你需要的详细性能指标,比nvprof的信息更全面。
4. 确保应用和共享库带有调试符号
如果你的共享库被剥离了调试符号(比如编译后用了strip),nvprof可能无法识别CUDA内核,导致无输出:
- 编译CUDA代码时添加
-G(生成调试信息)和-lineinfo(保留行号)参数 - 编译C/C++共享库时不要加
-s或strip,确保带上-g参数保留调试符号
内容的提问来源于stack exchange,提问作者Ken Y-N
相关产品推荐
相关产品推荐

