使用 MUSA Mapping 在编译期实现 CUDA 兼容
什么是 MUSA Mapping?
MUSA Mapping(安装路径 /usr/local/musa/tools/musaMapping)是 MUSA Toolkits 提供的 编译期 CUDA 兼容层。它在 mcc 编译过程中加载 Clang 前端插件 libMusaMapping.so,对源码进行预处理与 AST 重写,将 CUDA 风格的:
#include头文件路径(如cuda_runtime.h→musa_runtime.h)- API / 宏 / 类型标识符(如
cudaMalloc→musaMalloc,CUBLAS→MUBLAS) - 部分生态专用头(PyTorch、cuDNN、CuTe/CUTLASS 等)
自动替换为 MUSA 对应符号,源文件仍保持 CUDA 写法。
与 musify 的区别
| 维度 | musify | MUSA Mapping |
|---|---|---|
| 时机 | 编译前,离线改源文件 | 编译时,不改磁盘上的源文件 |
| 实现 | Python 文本匹配(musify-text) | Clang 插件(语义感知重写) |
| 典型场景 | 一次性迁移、可审查 diff | 直接编译未改的 .cu、CMake 伪装 nvcc、大型第三方工程 |
| 输出 | 生成 MUSA 风格源码 | 生成目标文件 / 可执行文件 |
两者可配合使用:先用 musify 做粗迁移,再用 MUSA Mapping 编译仍含 CUDA 名的依赖或宏。
工作原理
CUDA 风格源码 (.cu / .c / .h)
│
▼
mcc + libMusaMapping.so (-fplugin, -x musa)
│
├── 读取 mapping/*.json、custom_defines.h
├── 重写 #include、标识符、宏
└── 编译为 MUSA 设备 / Host 目标代码
│
▼
链接 libmusart、libmusa 等 → 可执行文件
插件在编译时会:
- 根据
MUSAMAPPING_PATH加载映射表; - 在预处理阶段处理
#include等(MusaMappingPPCallback); - 在 AST 阶段做标识符替换(
MusaMappingASTConsumer); - 注入
custom_defines.h中的宏定义,保证宏展开前已完成 CUDA→MUSA 映射。
安装与目录结构
安装 MUSA SDK 后,工具位于 /usr/local/musa/tools/musaMapping/。插件完整路径为:
/usr/local/musa/tools/musaMapping/libMusaMapping.so
目录结构如下:
/usr/local/musa/tools/musaMapping/
├── libMusaMapping.so # Clang 插件(核心)
├── mcc_wrapper # 兼容 nvcc 调用方式的包装脚本
├── custom_defines.h # 宏映射表(与 JSON 对应,约 3 万行)
├── mapping/
│ ├── general.json # 标识符 / 宏(约 3 万条)
│ ├── include.json # CUDA SDK 头文件映射
│ ├── torch-include.json # PyTorch CUDA 头 → torch_musa
│ ├── dnn-header.json # cuDNN 等
│ └── other-include.json # CuTe/CUTLASS(cute/ → mute/)等
└── cmake/Modules/ # CMake CUDA 工具链兼容模块(支持 project(... LANGUAGES CUDA))
前提条件:
- 已安装 MUSA SDK(
mcc、libmusart.so、MUSA 头文件); - 编译时需能加载
libMusaMapping.so(与mcc同套 LLVM/Clang 构建)。