Refer to documentation at https://xtc-tools.github.io/xtc
Refer to tutorials here and to additionnal developers documentation here.
XTC is a domain-specific dataflow graph compiler for linear algebra operations. It provides:
- Operational DSL: Define computation graphs with tensors and operators
- Scheduling DSL: High-level transformations (tiling, parallelization, vectorization, etc.)
- Multiple backends: MLIR (linalg + transform), TVM (Tensor IR), JIR (INRIA internal)
- Autotuning: Definition and exploration of the optimization space
If needed, install uv following the instructions here.
Debian-like x86_64 or aarch64 Linux distributions (Python: 3.10 to 3.14 inclusive):
sudo apt install python3 python3-dev build-essential libomp5 binutils binutils-aarch64-linux-gnu binutils-x86-64-linux-gnu
sudo apt install libpfm4-dev # Optional: interface to Linux perf counters
sudo sysctl kernel.perf_event_paranoid=1 # Optional: give access to hardware counters
uv venv -p 3.12 && source .venv/bin/activate
uv pip install -e '.[dev]'
make testMacOs M1+ macos-14/macos-15 (Python: 3.10 to 3.14 inclusive):
brew install libomp x86_64-linux-gnu-binutils aarch64-elf-binutils
export DYLD_LIBRARY_PATH="/opt/homebrew/opt/libomp/lib:$DYLD_LIBRARY_PATH"
uv venv -p 3.12 && source .venv/bin/activate
uv pip install -e '.[dev]'
make testNote that [dev] extension installs both mlir and tvm backends in addition to development tools.
Available extensions are:
[mlir]: MLIR backend[tvm]: TVM backend[test]: develop, docs and tests tools[default]: mlir + tvm[dev]: default + test
Code quality requirements:
- Type annotations: Strict pyright mode, full annotations required
- Formatting: Ruff (line length 88)
- License headers: BSD-3-Clause required on all source files
- All checks must pass before merge
Type checking:
make check-type # Run both pyright and mypy
pyright # Run pyright only
mypy # Run mypy onlyFormatting:
make format # Apply all formatting (license + ruff)
make check-format # Check formatting without modifying filesTesting structure:
tests/pytest/unit/: Core interface unit teststests/pytest/{mlir,tvm}/: Backend-specific teststests/filecheck/: Lit+FileCheck functional tests for code generation
Global test commands:
make test # Run minimal unit tests
make check # Run ALL acceptance tests (required for contributions)
make check-pytest # Run pytest suite only
make check-lit # Run LIT tests for LLVM IR target
make check-lit-c # Run LIT tests for C target
pytest tests/pytest/unit # Run specific test directoryRunning individual tests:
# Single pytest file
pytest tests/pytest/unit/test_specific.py -v
# Single lit test
lit -v tests/filecheck/backends/specific_test.py
# C target for lit tests
XTC_MLIR_TARGET=c lit -v tests/filecheck/backends/specific_test.pyPython package dependencies are listed in dependencies.toml with definition of groups and groups
dependencies.
Always update dependencies there and run make dependencies to update pyproject.toml before commit.
Abstract interfaces defining the compilation pipeline:
data/- Tensor, DataType, ShapeTypeoperator/- Linear algebra operator interfacegraph/- Graph, Node, Operation abstractionsback/- Backend interfaceschd/- Scheduler and Schedule abstractionscomp/- Compiler interfaceexec/- Executor and Evaluator interfacessearch/- Search space exploration interface
Exposed backends:
mlir/- MLIR backend using linalg + transform dialectstvm/- TVM backend using Tensor IR + Schedule APIs
XTC also supports multiple MLIR Targets for the code generation:
- llvmir (default)
- c
- nvgpu
To force the use of a specific target, you can set the env variable XTC_MLIR_TARGET=<mlir-target>.
The MLIR backend can be extended using the SDist extension, which provides distribution primitives. To install SDist, follow the instructions in docs/develop/optional_backends.md, in the "MLIR development version" section.
Note that the nvgpu target requires a recent version of Cuda (tested with Cuda 13.0). By default, it tries to find Cuda at /usr/local/cuda, but it can be overridden with the CUDA_INSTALL_DIR env variable. The performance counters can be accessed is the GPU has a compute capability >=7.5.
- User defines Graph with Tensors and Operators
- Backend created from Graph
- Scheduler applies transformations and produces Schedule
- Compiler generates executable Module
- Executor/Evaluator runs and measures performance
mlir-loop- High-level scheduling for MLIR linalg operatorsmlir-backend- MLIR backend wrapperloop-explore- Autotuning and space explorationloop-display- Visualization of exploration results
To create agent guidance files from this README: make agents (AGENTS.md) or make claude (CLAUDE.md)
