apache--tvm
197 行
8.8 KiB
ReStructuredText
197 行
8.8 KiB
ReStructuredText
.. Licensed to the Apache Software Foundation (ASF) under one
|
|
or more contributor license agreements. See the NOTICE file
|
|
distributed with this work for additional information
|
|
regarding copyright ownership. The ASF licenses this file
|
|
to you under the Apache License, Version 2.0 (the
|
|
"License"); you may not use this file except in compliance
|
|
with the License. You may obtain a copy of the License at
|
|
|
|
.. http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
.. Unless required by applicable law or agreed to in writing,
|
|
software distributed under the License is distributed on an
|
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
KIND, either express or implied. See the License for the
|
|
specific language governing permissions and limitations
|
|
under the License.
|
|
|
|
Overview
|
|
========
|
|
|
|
TIRx (pronounced *"tier-ex"*) is an open-source, hardware-native DSL and compiler
|
|
for machine-learning kernels. It targets the part of the AI software stack
|
|
where fast-moving kernels meet fast-moving hardware: TIRx compiles to GPUs and
|
|
specialized AI accelerators today and is designed to grow with the hardware
|
|
generations that follow. The same design makes it a substrate not only for
|
|
expert-written kernels, but also for agent-generated kernels and megakernel
|
|
systems.
|
|
|
|
TIRx is the next-generation kernel-level compiler structure of Apache TVM, and
|
|
is built on top of the TVM compiler infrastructure.
|
|
|
|
.. figure:: https://raw.githubusercontent.com/tlc-pack/web-data/main/images/tirx/tirx_overview_hero.png
|
|
:align: center
|
|
:alt: A TIRx kernel keeps orchestration in hardware-native source while exposing tile
|
|
structure to the compiler; agentic, megakernel, and new-backend systems
|
|
build on the same structure.
|
|
|
|
A TIRx kernel keeps orchestration — pipeline state, roles, synchronization,
|
|
and backend intrinsics — in hardware-native source, while execution scope,
|
|
tensor layout, and tile primitive dispatch expose the recurring tile
|
|
structure to the compiler. Higher-level systems build on the same structure.
|
|
|
|
Design Philosophy
|
|
-----------------
|
|
|
|
Kernel DSLs are most effective when they choose the right boundary between the
|
|
programmer and the machine. For mature kernels on mature hardware, that boundary
|
|
can be high-level: the compiler hides thread assignment, memory movement, layout
|
|
details, and instruction selection behind compact tensor or tile abstractions,
|
|
and this works well for established kernel patterns.
|
|
|
|
At the frontier, the same boundary is under more pressure. New instructions,
|
|
memory spaces, cooperation patterns, and kernel algorithms often appear *before*
|
|
a compiler has enough built-in machinery to automate them well.
|
|
|
|
TIRx chooses a **lower and more explicit boundary**. It keeps the parts of a
|
|
kernel that frequently require expert control — pipeline structure,
|
|
synchronization, role assignment, memory placement, and backend intrinsics — in
|
|
hardware-native source code. At the same time, it exposes the recurring tile-level
|
|
structure to the compiler through three constructs: *execution scope*, *tensor
|
|
layout*, and *tile primitive dispatch*. Orchestration stays in hardware-native
|
|
source code, while the recurring tile-level structure becomes visible to the
|
|
compiler. Hardware-native control is powerful but costs engineering effort;
|
|
exposing recurring operations as tile primitives relieves this, since authors
|
|
reuse a dispatched implementation instead of re-writing the same operation for
|
|
each kernel and backend.
|
|
|
|
The result is a DSL that can **grow with the hardware**. A new feature can first
|
|
be used directly as a native intrinsic, and later become a reusable primitive
|
|
once the pattern stabilizes. This is the core design philosophy behind TIRx:
|
|
keep the foundation small and explicit, and let the backend library evolve as
|
|
new accelerator generations arrive.
|
|
|
|
The Programming Model
|
|
---------------------
|
|
|
|
A TIRx program reads as a structured native kernel: loops, branches, buffers,
|
|
synchronization, pipeline state, backend intrinsics, and hardware roles are
|
|
written directly. Tile primitives appear exactly where a repeated hardware-level
|
|
operation should become reusable and dispatchable.
|
|
|
|
The model has three core ingredients.
|
|
|
|
Execution scope
|
|
~~~~~~~~~~~~~~~~~
|
|
|
|
Execution scope describes both the active participants and the logical scope of
|
|
a primitive invocation. Control flow such as ``if wg_id == ...``,
|
|
``warp_id == ...``, or ``cbx == ...`` selects which hardware roles enter a
|
|
region, while predicates such as ``T.ptx.elect_sync()`` further select the
|
|
issuing thread.
|
|
|
|
The primitive namespace is also part of the scope. For example, ``Tx.wg.*``
|
|
denotes warpgroup-level primitives, while an unqualified ``Tx.*`` call defaults
|
|
to thread-level invocation.
|
|
|
|
Tensor layout
|
|
~~~~~~~~~~~~~~
|
|
|
|
Tensor layout, with a storage-first interface, describes how logical
|
|
tensors map to physical resources. A tile may live in global memory, shared
|
|
memory, registers, tensor memory, or accelerator SRAM.
|
|
Users declare where each tile lives and how its elements are spread across
|
|
lanes, warps, and registers; tile primitive dispatch reads those declarations to
|
|
choose an implementation. A layout is a storage description, not a
|
|
loop-transformation utility: users may construct a tile's layout, but never use
|
|
layouts to transform loops.
|
|
|
|
.. seealso::
|
|
|
|
The layout model — including the shard / replica / offset structure and its
|
|
design rationale — is described in :doc:`layout`, which also has an
|
|
interactive explorer.
|
|
|
|
Tile primitive dispatch
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Tile primitive dispatch selects an implementation according to the primitive,
|
|
the current execution scope, the operand layouts, and the target backend. For
|
|
example:
|
|
|
|
- A ``copy`` primitive may dispatch to TMA, vectorized loads/stores,
|
|
tensor-memory movement, accelerator DMA, or another backend-specific
|
|
implementation.
|
|
- A matrix-multiply primitive may dispatch to WGMMA, ``tcgen05``, a
|
|
systolic-array instruction, or a backend-specific matmul engine.
|
|
|
|
Once a variant is selected, dispatch generates the loops and addressing to
|
|
apply that instruction across the whole tile.
|
|
|
|
Putting it together
|
|
~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Across a full kernel, orchestration stays in ordinary source code, and the
|
|
recurring hardware operations appear as tile primitives. For the building blocks —
|
|
TMA loads, ``tcgen05`` async MMA, reductions, and the rest — see the per-dispatch
|
|
walkthroughs in :doc:`tile_primitives`.
|
|
|
|
What TIRx Enables
|
|
-----------------
|
|
|
|
TIRx is immediately useful as a kernel DSL. The same structure also helps with
|
|
three things that are becoming important for ML systems: supporting new
|
|
hardware, building megakernels, and agentic kernel programming.
|
|
|
|
A stable extension boundary for future hardware
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
New hardware support is a staged process rather than a redesign of the DSL: a
|
|
feature is first exposed as a backend intrinsic, then promoted into a tile
|
|
primitive once the usage pattern repeats. Future hardware grows the backend
|
|
library, not the core language.
|
|
|
|
Megakernels and composable tile tasks
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Because TIRx tasks exist as compiler IR rather than separately compiled kernels,
|
|
a megakernel compiler can stitch and schedule them directly — re-offsetting
|
|
shared memory, renaming barriers, reassigning warp roles, and interleaving
|
|
pipelines across tasks.
|
|
|
|
.. figure:: https://raw.githubusercontent.com/tlc-pack/web-data/main/images/tirx/tirx_megakernel.png
|
|
:align: center
|
|
:alt: Kernel-by-kernel and CUDA-graph execution leave kernel boundaries
|
|
between tasks, while a megakernel fuses tasks into one kernel with
|
|
fine-grained dependencies and in-kernel scheduling.
|
|
|
|
From kernel-by-kernel launches to a single megakernel: fusing tasks into one
|
|
kernel exposes fine-grained dependencies and in-kernel (static or dynamic)
|
|
scheduling.
|
|
|
|
Agentic kernel programming
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
TIRx exposes its IR and compiler utilities through TVM FFI across Python, C++,
|
|
and Rust, and offers a structured search space with dense, pre-benchmark
|
|
feedback (well-formedness, synchronization validity, race-freedom, value
|
|
simulation).
|
|
|
|
.. figure:: https://raw.githubusercontent.com/tlc-pack/web-data/main/images/tirx/tirx_agentic.webp
|
|
:align: center
|
|
:alt: Agent-visible compiler infrastructure exposes TIRx IR and utilities via
|
|
TVM FFI across Python, Rust, and C++, over a structured search space
|
|
spanning levels L1 to L4.
|
|
|
|
Agent-visible compiler infrastructure (IR and utilities over TVM FFI) plus a
|
|
structured search space (levels L1–L4) make TIRx a compiler-mediated
|
|
optimization surface for agents.
|
|
|
|
Next Steps
|
|
----------
|
|
|
|
- :doc:`install` — install TIRx and the kernel library.
|
|
- :doc:`layout` — the tensor layout model with an interactive explorer.
|
|
- :doc:`arch/index` — compiler internals (lowering pipeline, passes, codegen).
|
|
- :doc:`api/index` — the ``tvm.tirx`` Python API.
|