TIRx:面向演进中的前沿机器学习(ML)内核的开放编译器栈

Lobsters AI 2026-06-23T09:13:53.662520

TIRx:面向演进中的前沿机器学习(ML)内核的开放编译器栈

今天,我们推出 TIRx——一个基于 Apache TVM 构建的开源、硬件原生 DSL(领域特定语言)与编译器,专为 ML 内核设计。它瞄准 AI 软件栈中快速演进的内核与快速迭代的硬件相交的部分:TIRx 目前编译到 GPU 和专用 AI 加速器,并设计为能够伴随后续各代硬件一同成长。同一套设计服务于专家编写的内核、智能体生成的内核以及巨型内核(megakernel)系统。

我们与更广泛的社区合作,在发布时提供了以下材料:

你可以找到以下资源:

动机

内核 DSL(领域特定语言)在选择程序员与机器之间的正确边界时最为有效。对于成熟的内核和成熟的硬件,该边界可以是高层级的:编译器将线程分配、内存移动、布局细节和指令选择隐藏在紧凑的张量或图块(tile)抽象背后。Triton 是典型的例子,它的普及显示出这在既定内核模式上效果有多好。在前沿领域,同一边界承受着更大的压力。新的指令、内存空间、协作模式和内核算法往往在编译器具备自动化它们的内置机制之前就已出现。当这种情况发生时,高层级编译器通常会隐藏的部分,恰恰是专家仍然需要手动控制的部分。

TIRx(发音为“tier-ex”)通过选择一条更低、更显式的边界来回应,其组织围绕三个决策:

结果是一个能够随硬件一起成长的 DSL 和编译器栈。这就是 TIRx 背后的核心设计哲学:保持基础小巧且显式,让后端库随着新一代加速器的到来而演进。

这使得 TIRx 位于像 TileLang 这样的系统之下。TileLang 也通过暴露内存作用域和流水线来相对于 Triton 降低边界,同时仍然将布局推断和线程绑定留给编译器。TIRx 有意将这些更高层次的问题留在其核心之外,并提供一个最小的基础,使此类系统可以在其上构建;我们正在与 TileLang 社区合作,将 TIRx 作为新的最小基础来支持 TileLang 编译。

同样的小巧、显式基础使得一种设计能够服务于几种追求峰值性能同时尽可能减少工程工作量的用户:专家编写的生产内核、智能体生成的内核,以及巨型内核系统——每一种都需要在原生层面的控制以及编译器可见的重复出现的操作。

本篇博文的其余部分将先介绍编程模型,然后依次讨论每个方向。

TIRx 编程模型

以下是该边界在实际中的样子。一个 TIRx 程序读起来就像结构化的原生内核:循环、分支、张量、同步、流水线状态和后端内建函数都是直接编写的。图块原语出现在需要使重复出现的硬件操作变得可复用和可分发的场合。三个要素承载了大部分模型。

执行作用域决定谁执行某个操作以及以何种粒度执行。两个东西选择它:控制流(选择进入某个区域的硬件角色)和原语命名空间(设置调用的粒度)。未限定的 Tx.* 调用在线程级别运行;Tx.wg.* 在 warpgroup 级别运行。像 T.ptx.elect_sync() 这样的谓词可以进一步将线程级调用缩小到单个发起线程。

张量布局通过存储优先的接口描述逻辑张量位于何处。一个图块可以位于全局内存、共享内存、寄存器、张量内存或加速器 SRAM 中。用户声明每个图块驻留在哪里以及其元素如何分布在通道(lane)、warp 和寄存器中;该声明保持附加到图块上。当调用一个原语时,编译器读取这些声明以选择实现。布局是一种存储描述,而不是循环变换工具:用户可以构造图块的布局,但绝不用布局来变换循环。

图块原语分发将一个调用转化为原生 IR(中间表示)。根据操作数布局、执行作用域和目标,或者显式的 dispatch= 提示,它选择匹配的实现:从全局到共享的拷贝解析为 TMA,从共享到寄存器的拷贝解析为 ldmatrix,从张量内存到寄存器的拷贝解析为 tcgen05.ld;矩阵乘法解析为 WGMMA、tcgen05 或脉动阵列指令。然后分发生成在整个图块上应用该指令所需的循环和寻址。

这些要素在作用域重要的地方结合起来。在下面的 GEMM 尾声(epilogue)中,warpgroup 作用域和线程作用域的原语位于同一区域:Tx.wg.* 调用跨 warpgroup 移动和转换一个图块,而最后通过显式发起线程谓词保护的线程作用域 Tx.copy_async 执行 TMA 存储。

以上摘录是简化的。要了解全貌,这里有一个完整的 FP16/BF16 GEMM 内核中的两个角色——TMA 生产者和张量内存写回。你不需要逐行阅读。关键是所有与编排相关的内容(流水线状态、屏障协议、角色选择、低级同步内建函数如 tcgen05.waitcp_async.bulk)都保留在源代码中(此处应有具体代码示例,但原文未给出完整代码,我们保持结构)。

查看原文