---
myst:
html_meta:
description: Stable ABI registration macros in PyTorch C++ — STABLE_TORCH_LIBRARY, STABLE_TORCH_LIBRARY_IMPL, and TORCH_BOX.
keywords: PyTorch, C++, stable ABI, STABLE_TORCH_LIBRARY, TORCH_BOX, macro, registration
---
# Library Registration Macros
These macros provide stable ABI equivalents of the standard PyTorch operator
registration macros (`TORCH_LIBRARY`, `TORCH_LIBRARY_IMPL`, etc.).
Use these when building custom operators that need to maintain binary
compatibility across PyTorch versions.
## STABLE_TORCH_LIBRARY
```{c:macro} STABLE_TORCH_LIBRARY(ns, m)
Defines a library of operators in a namespace using the stable ABI.
This is the stable ABI equivalent of {c:macro}`TORCH_LIBRARY`.
Use this macro to define operator schemas that will maintain
binary compatibility across PyTorch versions. Only one `STABLE_TORCH_LIBRARY`
block can exist per namespace; use `STABLE_TORCH_LIBRARY_FRAGMENT` for
additional definitions in the same namespace from different translation units.
:param ns: The namespace in which to define operators (e.g., `mylib`).
:param m: The name of the StableLibrary variable available in the block.
**Example:**
```cpp
STABLE_TORCH_LIBRARY(mylib, m) {
m.def("my_op(Tensor input, int size) -> Tensor");
m.def("another_op(Tensor a, Tensor b) -> Tensor");
}
```
Minimum compatible version: PyTorch 2.9.
```
## STABLE_TORCH_LIBRARY_IMPL
```{c:macro} STABLE_TORCH_LIBRARY_IMPL(ns, k, m)
Registers operator implementations for a specific dispatch key using the stable ABI.
This is the stable ABI equivalent of `TORCH_LIBRARY_IMPL`. Use this macro
to provide implementations of operators for a specific dispatch key (e.g.,
CPU, CUDA) while maintaining binary compatibility across PyTorch versions.
```
```{note}
All kernel functions registered with this macro must be boxed using
the `TORCH_BOX` macro.
```
:param ns: The namespace in which the operators are defined.
:param k: The dispatch key (e.g., `CPU`, `CUDA`).
:param m: The name of the StableLibrary variable available in the block.
**Example:**
```cpp
STABLE_TORCH_LIBRARY_IMPL(mylib, CPU, m) {
m.impl("my_op", TORCH_BOX(&my_cpu_kernel));
}
STABLE_TORCH_LIBRARY_IMPL(mylib, CUDA, m) {
m.impl("my_op", TORCH_BOX(&my_cuda_kernel));
}
```
Minimum compatible version: PyTorch 2.9.
## STABLE_TORCH_LIBRARY_FRAGMENT
```{c:macro} STABLE_TORCH_LIBRARY_FRAGMENT(ns, m)
Extends operator definitions in an existing namespace using the stable ABI.
This is the stable ABI equivalent of `TORCH_LIBRARY_FRAGMENT`. Use this macro
to add additional operator definitions to a namespace that was already
created with `STABLE_TORCH_LIBRARY`.
:param ns: The namespace to extend.
:param m: The name of the StableLibrary variable available in the block.
Minimum compatible version: PyTorch 2.9.
```
## TORCH_BOX
```{c:macro} TORCH_BOX(func)
Wraps a function to conform to the stable boxed kernel calling convention.
This macro takes an unboxed kernel function pointer and generates a boxed wrapper
that can be registered with the stable library API.
:param func: The unboxed kernel function to wrap.
**Example:**
```cpp
Tensor my_kernel(const Tensor& input, int64_t size) {
return input.reshape({size});
}
STABLE_TORCH_LIBRARY_IMPL(my_namespace, CPU, m) {
m.impl("my_op", TORCH_BOX(&my_kernel));
}
```
Minimum compatible version: PyTorch 2.9.
```