CUDA 内存与竞态检查:定位越界、未初始化读取、数据竞争和显存泄漏
Compute Sanitizer 是 NVIDIA 的 CUDA 运行时检查工具,取代旧的 cuda-memcheck。它通过插桩运行程序,检查显存越界、未对齐访问、未初始化读取、共享内存数据竞争、同步错误和显存泄漏。它适合定位“偶发崩溃、结果不稳定、显存缓慢增长”这类问题,不适合做性能分析。
四个常用工具:memcheck 查内存错误和泄漏,racecheck 查共享内存数据竞争,initcheck 查未初始化读取,synccheck 查线程同步错误。检查会显著拖慢程序,通常只在复现问题时使用。
# 默认 memcheck:查越界、非法访问和泄漏
compute-sanitizer ./app
# 完整泄漏检查,输出更多细节
compute-sanitizer --tool memcheck --leak-check full ./app
# 查共享内存数据竞争
compute-sanitizer --tool racecheck ./app
# 查未初始化读取
compute-sanitizer --tool initcheck ./app
# 限制输出条数,避免日志爆炸
compute-sanitizer --tool memcheck --print-limit 20 ./app
# 多进程/多卡程序:跟踪所有子进程
compute-sanitizer --target-processes all mpirun -np 8 ./app
# 带调试信息编译,定位到源码行
nvcc -g -lineinfo -O1 app.cu -o app
compute-sanitizer --tool memcheck ./app
Python/CUDA 框架(PyTorch、TensorFlow)也能被检查,但会非常慢;先用最小复现脚本缩小范围,不要直接跑完整训练。
-g -lineinfo,并保留对应源码版本。racecheck 报告共享内存竞争,但代码用原子操作保护:工具可能报告潜在竞争,要结合代码和同步语义判断,不要盲改。--leak-check full 的代价:完整泄漏检查更慢、输出更多;先用默认级别定位,再针对性开启。--target-processes all,否则看不到 worker 的错误。合上页面,先回答,再展开对照。
memcheck 和 racecheck 分别检查什么问题?memcheck 检查显存越界、非法访问和泄漏;racecheck 检查共享内存数据竞争。-g -lineinfo 保留调试信息,并确保运行的是对应源码版本;必要时降低优化级别复现。
小程序版
微信扫码,随时查命令