Skip to main content

MUSA Compute Sanitizer 最佳实践

本文档提供场景化的快速参考,帮助你快速找到常见问题的解决方案。

快速命令参考

基本使用:

# 默认检查(越界 + API 错误)
mt-compute-sanitizer ./my_program

# 启用所有检查(包括泄漏检查)
mt-compute-sanitizer --leak-check=full ./my_program

# 禁用 API 错误检查
mt-compute-sanitizer --report-api-errors=no ./my_program

常用选项:

选项描述默认值
--leak-check=full启用内存泄漏检查no
--report-api-errors=no禁用 API 错误报告all

场景一:首次使用 - 检查程序错误

用户问题

"我刚写完一个 MUSA 程序,运行时报错了,但我不知道具体哪里有问题,该怎么排查?"

解决步骤

最简单的使用方式:直接运行程序

mt-compute-sanitizer ./my_program

Sanitizer 会自动检测以下错误:

  • 内存越界访问
  • 内存泄漏
  • API 调用错误

预期输出

========= COMPUTE-SANITIZER
==PROF== 'my_program' started, pid:123456
==PROF== 'my_program' exit, exit code(0)
========= ERROR SUMMARY: 0 errors

如果有错误:

========= Device memory out of bounds. Address: 0x...
========= ERROR SUMMARY: 1 error

下一步

  • 无错误 → 继续 场景五 启用更多检查
  • 有错误 → 根据错误类型查看对应场景

场景二:检查内存越界访问

用户问题

"我的程序有时候能跑、有时候不能跑,怀疑是数组访问越界了,怎么确定?"

快速解决

# 越界检查默认启用
mt-compute-sanitizer ./my_program

典型输出

========= Device memory out of bounds. Address: 0x...
========= ERROR SUMMARY: 1 error

常见原因速查

原因快速修复
无边界检查添加 if (idx < n)
blockSize 过大确保 blockSize * gridSize <= n
指针计算错误检查指针算术

完整错误示例和修复代码,可参考 用户指南 - 越界检查


场景三:检查内存泄漏

用户问题

"我的程序运行一段时间后显存越来越少,怀疑有显存泄漏,怎么检测?"

快速解决

# 必须显式启用泄漏检查
mt-compute-sanitizer --leak-check=full ./my_program

典型输出

========= Leaked 4096 bytes at 0x1006da04000
========= ERROR SUMMARY: 3 errors

常见原因速查

原因快速修复
缺少 musaFree()为每个 musaMalloc() 添加对应 musaFree()
提前 return确保所有返回路径都释放内存
异常处理使用 RAII 或 try-catch 确保释放

完整错误示例和修复代码,可参考 用户指南 - 泄漏检查


场景四:检查 API 错误

用户问题

"我的程序有时候返回错误码,但不知道具体是什么错误,怎么办?"

快速解决

# API 错误检查默认已启用
mt-compute-sanitizer ./my_program

常见 API 错误速查

错误含义常见原因
invalid argument无效参数Size = 0, NULL 指针
out of memoryGPU 内存耗尽分配过多
invalid device无效 GPU 设备设备未初始化

完整 API 错误示例,可参考 用户指南 - API 错误检查


场景五:组合使用多种检查

用户问题

"我想同时检查内存越界和内存泄漏,该怎么操作?"

快速解决

# 启用所有检查
mt-compute-sanitizer --leak-check=full ./my_program

检查组合对比

命令越界泄漏API 错误
mt-compute-sanitizer ./app
mt-compute-sanitizer --leak-check=full ./app

场景六:解释错误信息

用户问题

"Sanitizer 输出了很多信息,但我看不懂,该怎么办?"

快速参考

错误摘要:

========= ERROR SUMMARY: X errors
  • 0 errors - 未检测到错误
  • >0 errors - 发现错误,查看上方详细信息

完整的错误信息解读,可参考 用户指南 - 常见错误模式


常见问题速查表

问题快速答案
内存泄漏检测不到使用 --leak-check=full 显式启用
只想检查某个 kernel目前需要通过代码插桩实现
不需要 API 错误报告使用 --report-api-errors=no 关闭

如需查看详细说明和完整示例,可参考 用户指南