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 的测试,验证方言语义和端到端编译流程。

典型工作流

  1. 编写:使用 CUDA Tile 方言在 MLIR 中编写内核(参见 README 示例)。
  2. 转换:使用 cuda-tile-translate 将其转换为 bytecode。
  3. 编译:将 bytecode 编译为 cubin(使用 tileiras)或 在运行时直接加载 bytecode —— 驱动程序会 JIT 编译它。
  4. 启动:通过 CUDA 驱动 API(或运行时 API)从主机程序启动内核。

构建与安装

  • 需要 CMake ≥ 3.20、C++17 编译器、Python ≥ 3.6,以及兼容的 LLVM/MLIR 检出版本(具体提交版本在 cmake/IncludeLLVM.cmake 中固定)。
  • 提供 LLVM 的三种方式:
    1. 让 CMake 自动下载正确的 LLVM 源码(较慢但最简单)。
    2. 将 CMake 指向本地 LLVM 源码树。
    3. 链接到预构建的 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 工作流中。

相关

  • 项目
  • 项目
  • 项目
  • 项目
  • 项目