mcc 编译器
1. 概述
mcc 是基于 clang 的 MUSA 编译驱动入口,负责处理同时包含 Host 代码和 Device 代码的源文件,并在需要时完成设备代码嵌入、链接和最终可执行文件生成。
MUSA 程序通常由两部分组成:
- 运行在 CPU 上的 Host 代码
- 运行在 MTGPU 上的 Device 代码
mcc 的核心目标是屏蔽这两条编译路径背后的细节,让用户尽量通过一条统一命令完成:
- 预处理
- Host 编译
- Device 编译
- Device 链接
- 嵌入设备镜像
- Host 链接
1.1 前提条件
mcc当前运行于 Linux 环境mcc默认从/usr/local/musa查找 MUSA Toolkit- 可以通过
--musa-path指定非默认安装路径 - 若需要链接运行时,通常还需要
-lmusart和-L/usr/local/musa/lib - 建议用户具备一定的 C/C++ 编程基础,了解 clang/clang++ 的基本用法
1.2 MCC 的作用
mcc 的价值不在于替代底层编译器,而在于:
- 为 MUSA 源文件提供统一驱动入口
- 管理 Host/Device 双路径编译
- 管理 MTGPU 目标相关参数
- 在常规单文件模式与分离式编译模式之间提供一致接口
2. Host 编译器
mcc 保留 clang/clang++ 的大部分通用行为,并推荐统一使用 mcc 作为入口驱动。
在 mcc 的编译模型下:
- Host 侧编译器统一为 clang
- 用户通常不需要显式单独调用 host 编译器
- 普通 C/C++ 编译选项、头文件路径、库路径、链接行为,大体与 clang/clang++ 保持一致
推荐做法:
- 统一使用
mcc作为 Host + Device 的入口 - 即便只编译 Host 部分,也优先使用
mcc
3. 编译阶段
mcc 的编译阶段采用通用的异构编译驱动模式,但后端 目标和部分开关与 MTGPU/MUSA 适配。
3.1 MCC 识别宏
下表列出 mcc 路径下最基础、最稳定可见的识别宏。
| 宏名 | 说明 |
|---|---|
__MUSACC__ | 使用 mcc 编译源文件时定义。用于识别当前编译由 mcc 路径处理。 |
__MUSA_ARCH__ | 编译设备端源文件时定义。其值表示当前目标设备架构编号。 |
__MUSART_API_VERSION | MUSA Runtime API 版本信息可用时定义。用于表示运行时 API 版本。 |
MUSART_VERSION | 在定义 Runtime API 版本信息时可用,通常作为 __MUSART_API_VERSION 的别名。 |
MUSA_VERSION | MUSA SDK 版本信息可用时定义。用于表示当前 SDK 版本。 |
补充说明:
__MUSACC__在 Host 和 Device 编译路径下都可见__MUSA_ARCH__只在设备端编译路径下可见,其值等于当前目标架构编号MUSART_VERSION基本可视为__MUSART_API_VERSION的别名
3.2 MCC 编译阶段
mcc 支持的阶段可以类比为:
- 预处理
- Host 侧前端编译
- Device 侧前端编译
- LLVM IR / 对象文件生成
- Device 代码链接
- Device 镜像嵌入 Host 目标文件
- Host 链接
其中最重要的几种工作模式是:
- 同时编译 Host + Device
- 只编译 Device
- 只编译 Host
- 分离式编译
- 多架构 fatbinary 编译
3.3 支持的输入文件后缀
| 输入后缀 | 说明 |
|---|---|
.mu | MUSA 源文件,包含 Host 与 Device 代码 |
.c | C 源文件 |
.cc, .cxx, .cpp | C++ 源文件 |
.ll | LLVM IR 文件 |
.o, .obj | 目标文件 |
.a | 静态库 |
.so | 动态库 |
3.4 支持的阶段控制
mcc 当前常用的 phase control 选项如下:
| 选项 | 说明 |
|---|---|
-c | 只运行编译/汇编,不执行最终链接 |
-emit-llvm | 输出 LLVM 表示 |
--musa-compile-host-device | 同时编译 Host 与 Device,默认行为 |
--musa-device-only | 只编译 Device 部分 |
--musa-host-only | 只编译 Host 部分 |
-fgpu-rdc | 打开可重定位设备代码,供分离式编译/设备链接使用 |
说明:
提示
--musa-device-only/--musa-host-only用于显式选择 Device 或 Host 编译路径- 分离式编译时,通常与
-fgpu-rdc一起使用
4. 编译轨迹
mcc 的总体编译轨迹如下:

编译流程说明:
- 输入源文件(.mu / .cu / .cpp)→ 预处理
- 预处理后 → 拆分为 Host 和 Device 两条编译路径
- Device 路径:
- Device 前端编译 → LLVM IR
- MTGPU 代码生成 → Device 目标文件
- (可选)Device 链接 → GPU 二进制 / Fatbinary
- 将 GPU 二进制嵌入 Host 目标文件
- Host 路径:
- Host 前端编译 → LLVM IR → Host 目标文件
- Host 目标文件 + 嵌入的 GPU 二进制 → Host 链接
- 最终输出:可执行文件或共享库
4.1 单文件默认模式
默认情况下,mcc 会:
- 从一个源文件中拆出 Host 路径和 Device 路径
- 先生成 Device 目标代码
- 把 Device 镜像嵌入到 Host 目标文件
- 再完成最终链接
4.2 多架构编译
可以通过重复传递 --offload-arch 生成多架构 fatbinary,例如:
mcc axpy.mu \
--offload-arch=<arch1> \
--offload-arch=<arch2> \
-lmusart -L/usr/local/musa/lib -o axpy
这类命令会把多个设备架构版本一并打入最终产物。
5. MCC 命令选项
本章按通用异构编译驱动的方式整理 mcc 常用选项。未列出的通用编译选项,通常可参考 clang/LLVM 行为。
5.1 命令选项类型与记号说明
mcc 的命令行选项风格整体继承 clang/LLVM,可以分成以下几类:
- 文件与路径类选项
- 编译阶段控制类选项
- 编译器/链接器行为控制类选项
- Host/Linker/Backend 透传类选项
- MUSA/MTGPU 专用扩展类选项
常见记号约定:
file:文件名dir:目录名path:路径arch:MTGPU 目标架构,例如mp_21N:数值型参数
5.2 命令选项说明
5.2.1 文件和路径选项
| 选项 | 说明 |
|---|---|
-o <file> | 指定输出文件名 |
-x <language> | 显式指定输入语言 |
-D<macro>=<value> | 定义预处理宏 |
-U<macro> | 取消预定义宏 |
-include <file> | 在主文件前强制包含头文件 |
--musa-path=<path> | 指定 MUSA Toolkit 根目录 |
--musa-path-ignore-env | 忽略环境变量中的 Toolkit 路径信息 |
--musa-inc-path=<path> | 指定 MUSA 头文件目录 |
--musa-libdevice-path=<path> | 指定 libdevice 路径 |
--musa-rt-lib-path=<path> | 指定 MUSA runtime 库路径 |
-I <dir> | 增加头文件搜索路径 |
-isystem <dir> | 增加 system 头文件搜索路径 |
-L <dir> | 增加库搜索路径 |
-MF <file> | 指定依赖文件输出名 |
-MP | 为依赖中的目标生成 phony target |
5.2.2 阶段控制选项
| 选项 | 说明 |
|---|---|
-c | 编译生成目标文件,不做最终链接 |
-emit-llvm | 输出 LLVM IR/bitcode 形式 |
-E | 仅预处理 |
-M | 生成 make 依赖 |
-MM | 生成不含 system headers 的依赖 |
-MD | 编译同时生成依赖 |
-MMD | 编译同时生成不含 system headers 的依赖 |
--musa-compile-host-device | 同时编译 Host 和 Device |
--musa-device-only | 只编译 Device |
--musa-host-only | 只编译 Host |
-fgpu-rdc | 生成可重定位设备代码 |
说明:
提示
mcc支持-c、-E、-M、-MM、-MD、-MMD这组 clang 风格阶段控制选项-fatbin/-mubin类中间产物在实际使用中可通过--save-temps获取
5.2.3 编译器和链接器行为选项
| 选项 | 说明 |
|---|---|
--help, -help | 显示帮助信息 |
--help-hidden | 显示隐藏选项 |
-v | 打印子命令和详细执行过程 |
-### | 只打印将执行的子命令,不真正执行 |
--version | 打印版本信息 |
--save-temps | 保留中间文件 |
-l<name> | 链接指定库 |
-nogpuinc | 不自动添加 GPU 相关默认 include 路径 |
-nogpulib | 不自动链接设备端默认库 |
5.2.4 MUSA/MTGPU 目标与 Offload 控制选项
| 选项 | 说明 |
|---|---|
-mtgpu | 将源码按 MTGPU/MUSA 路径处理;对 .cu 文件尤为重要 |
--offload-arch=<arch> | 指定设备架构,可重复指定实现多架构编译 |
-cuda_wrapper | 启用兼容封装模式,兼容既有 API 调用方式 |
5.2.5 优化选项
| 选项 | 说明 |
|---|---|
-O1 / -O2 / -O3 | 优化等级 |
-O | 等价于 -O2 |
注意:
mcc的默认优化等级是-O2
5.2.6 前端选项
| 选项 | 说明 |
|---|---|
-Wno-shared-var-init | 忽略 shared memory 初始化引发的报错,需用户自行确保安全性 |