系统学习 AI 学习路径:从 GPU 运行时到推理、微调与 RAG 评估

compute-sanitizer

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)也能被检查,但会非常慢;先用最小复现脚本缩小范围,不要直接跑完整训练。

易错点与排错

相关命令

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. memcheck 和 racecheck 分别检查什么问题?
  2. 为什么运行 sanitizer 后程序会慢很多?能用它评估性能吗?
  3. 报告只有地址、没有源码行,应该怎么改进?
答案
  1. memcheck 检查显存越界、非法访问和泄漏;racecheck 检查共享内存数据竞争。
  2. 因为它对内存访问和同步进行插桩,开销很大;不能用于性能评估,性能分析用 Nsight Systems/Compute。
  3. 编译时加 -g -lineinfo 保留调试信息,并确保运行的是对应源码版本;必要时降低优化级别复现。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令