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 | 动态库 |