MCC 用户手册
本文档描述了如何使用 mcc 编译 MUSA 代码,并提供了一些关于 mcc 实现的详细信息。
本文档假设您对 CUDA 编程语言有基本的了解。有关 CUDA 编程的信息可以在 CUDA 编程指南中找到。
概览
MUSA是一种类似于 CUDA 的编程语言,用于在 MTGPU 设备上进行并发编程。
先决条件
mcc 目前支持构建与 CUDA 11.4 兼容的 MUSA。在构建 MUSA 代码之前,您需要安装 MUSA Toolkit。mcc 将尝试在默认路径 “/usr/local/musa” 下找到 MUSA 安装。用户也可以通过 “--musa-path” 选项指定 MUSA Toolkit 位置的不同路径。
MUSA 编译目前仅在 Linux 上支持。Windows 上的编译器即将推出。
MCC的目的
MUSA应用程序由传统的 C++ 主机代码和 GPU 设备函数混合而成,这使得编译过程涉及每个 MUSA 源文件的多个编译和链接步骤。 mcc,MUSA 编程语言编译器驱动程序,有助于隐藏构建源代码的这些阶段的复杂性。
编译阶段
大多数情况下,mcc 中的 MUSA 编译与传统 C++ 类似,使用 clang++:
- 预处理源代码,通过宏扩展和头文件包含来处理宏和包含指令。
- 编译为 llvm ir,通过一系列有组织的转换和优化传递。
- 代码生成:降低到目标特定代码并生成对象文件。
- 链接库以生成可执行二进制文件,包括静态/共享库和独立可执行文件。
不同之处在于 MUSA 代码与主机端部分和设备端部分混合。基本上,mcc 将编译源代码两次以生成设备代码对象和主机代码对象,然后尝试将它们组合在一起。因此,上述阶段至少会为设备端代码和主机端部分重复两次。
详细来说,在代码生成之前,设备代码对象的二进制值将被分配给全局常量变量,当编译主机端代码时。主机端代码的阶段与传统 C++ 几乎相同。
当内核被发射到 GPU 设备时,MUSA 运行时和驱动程序将帮助提取设备代码对象,这超出了本文档的范围。
编译轨迹
由mcc驱动的编译遵循以下轨迹:

支持的输入文件后缀
由mcc驱动的编译的每个阶段都接受特定的输入文件。mcc将通过文件后缀和编译选项来识别它们。
| 输入文件后缀 | 描述 |
|---|---|
| .mu | 一个 MUSA 源文件,包含主机代码和设备函数。 |
| .c | 一个 C 源文件。 |
| .cc, .cxx, .cpp | 一个 C++ 源文件。 |
| .ll | 一个 LLVM IR 文件。 |
| .o, .obj | 一个对象文件。 |
| .a | 一个库文件。 |
| .so | 一个共享库文件。 |
其他文件后缀由 clang/clang++ 支持。
编译器命令行选项
mcc是MUSA语言的编译器驱动程序,受 llvm-project 14.0.0 启发。大多数编译器选项与 Clang 和 LLVM 工具链一样有效。此外,它还为 MUSA 语言和 MTGPU 目标提供了特定选项。
帮助信息选项
--help/-help
显示可用选项的帮助。
--help-hidden
显示隐藏选项的帮助。
-v
显示子命令的详细输出。
--version
打印版本信息。
输入文件和规范选项
-o [file]
定义输出文件的名称。
-x [language]
指定输入文件的语言(例如 -x musa),后续输入文件将被识别为具有类型。
-D [macro]=[value]
定义[macro]为[value](如果省略[value]则为1)。