NVIDIA/cuda-tile
CUDA Tile IR is an MLIR-based intermediate representation and compiler infrastructure for CUDA kernel optimization, focusing on tile-based computation patterns and optimizations targeting NVIDIA tensor core units.
NVIDIA / cuda‑tile – CUDA Tile IR
是什么
- 基于 MLIR/LLVM 的开源编译器基础设施,引入了新的 CUDA Tile dialect。
- 该方言表达了可高效映射到 NVIDIA GPU(尤其是 Tensor-Core 单元)的 基于 tile 的计算模式。
- 随附内容包括:
- MLIR 方言(用于表示 tiled 张量、指针等的操作与类型)
- 用于程序化构建和转换 IR 的 Python 绑定
- 二进制 bytecode 格式及工具,用于在 MLIR 文本、bytecode 和最终 GPU 二进制文件(cubin)之间进行转换
- 一致性测试套件。
为何重要
- 分块(Tiling)是高性能内核(矩阵乘法、卷积等)的核心优化技术。通过提供一等抽象,CUDA Tile 使开发者能够在更高层次编写内核,同时仍能暴露低层控制能力,以达到手写优化 CUDA 的性能水平。
- 与 CUDA Toolkit 13.1 版本集成,因此生成的代码可通过常规 CUDA 驱动 API 启动。
核心组件
| 组件 | 用途 |
|---|---|
| CUDA Tile Dialect | 定义 tile<…> 类型、load_ptr_tko、print_tko、reshape、broadcast 等操作的 MLIR 方言,专为 GPU 内存层次结构和 Tensor-Core 使用而设计。 |
| Python 绑定 | 允许脚本无需编写 C++ 即可构建、检查和运行 Tile IR 的转换 pass。 |
| Bytecode | 紧凑的二进制表示(.tilebc),可由 CUDA 驱动程序 JIT 编译,或使用 tileiras 提前编译为 cubin。 |
| 测试套件 | 基于 LLVM‑lit 的测试,验证方言语义和端到端编译流程。 |
典型工作流
- 编写:使用 CUDA Tile 方言在 MLIR 中编写内核(参见 README 示例)。
- 转换:使用
cuda-tile-translate将其转换为 bytecode。 - 编译:将 bytecode 编译为 cubin(使用
tileiras)或 在运行时直接加载 bytecode —— 驱动程序会 JIT 编译它。 - 启动:通过 CUDA 驱动 API(或运行时 API)从主机程序启动内核。
构建与安装
- 需要 CMake ≥ 3.20、C++17 编译器、Python ≥ 3.6,以及兼容的 LLVM/MLIR 检出版本(具体提交版本在
cmake/IncludeLLVM.cmake中固定)。 - 提供 LLVM 的三种方式:
- 让 CMake 自动下载正确的 LLVM 源码(较慢但最简单)。
- 将 CMake 指向本地 LLVM 源码树。
- 链接到预构建的 LLVM 安装(若需要 Python API,则必须使用
-DMLIR_ENABLE_BINDINGS_PYTHON=ON构建)。
- 可选标志:
-DCUDA_TILE_ENABLE_BINDINGS_PYTHON=ON– 构建 Python API。-DCUDA_TILE_ENABLE_TESTING=ON– 构建并运行 lit 测试套件。-DCUDA_TILE_ENABLE_CCACHE=ON– 加速重新编译。
示例(来自 README)
# 构建库和工具
cmake -G Ninja -S . -B build \
-DCMAKE_BUILD_TYPE=Release \
-DCUDA_TILE_ENABLE_BINDINGS_PYTHON=ON \
-DCUDA_TILE_ENABLE_TESTING=ON
cmake --build build
# 将 MLIR 文件转换为 bytecode
cuda-tile-translate example.mlir \
--bytecode-version=13.1 \
--mlir-to-cudatilebc --no-implicit-module -o example.tilebc
# 提前编译为 cubin(将 sm_100 替换为你的 GPU 架构)
tileiras --gpu-name sm_100 example.tilebc -o example.cubin
# 编译并运行加载 cubin 的主机程序
g++ example_host.cpp -o example -I/usr/local/cuda/include \
-L/usr/local/cuda/lib64 -lcuda
./example
该程序打印数据数组,展示了从 Tile IR 源码到 GPU 执行的完整端到端路径。
使用场景
- 需要利用 Tensor-Core 的深度学习算子自定义内核的研究人员。
- 希望拥有可重用的高阶分块算法表示,同时保留生成低层 CUDA 能力的性能工程师。
- 扩展 MLIR 以支持 GPU 特定转换的工具开发者;CUDA Tile 提供了具体的方言和测试框架。
版本与兼容性
- 开源版本与 CUDA Toolkit 版本(
13.1.x)保持一致。补丁 号跟踪开源代码本身的发布。 - 每个发布版本都与特定的 LLVM 提交范围绑定;辅助脚本(
scripts/get-cuda-tile-version-for-llvm-hash.sh)可帮助为给定的 LLVM 版本选择正确的 CUDA Tile 标签。
贡献模式
- 项目采用 Apache‑2.0 with LLVM exceptions 开源许可,但 README 指出目前 不接受外部贡献。用户被鼓励提交问题以报告错误或提供反馈。
总结:CUDA Tile 是一个真正的、生产级别的编译器栈,通过 MLIR 方言让你编写和优化分块 GPU 内核,并提供完整的工具链用于转换、测试和集成到现有 CUDA 工作流中。
相关
- 项目
- 项目
- 项目
- 项目
- 项目