Backend Selection
How NIXL Selects Backends
NIXL automatically selects the optimal backend based on the source and destination memory types and the backends available on both the local and remote agents. When multiple backends support a given transfer, NIXL chooses the most efficient one.
To override automatic selection, specify the desired backend when creating a transfer request. In most cases, automatic selection is the recommended approach.
In Python, backends listed in nixl_agent_config.backends (default: ['UCX']) are
auto-initialized when the agent is created. In C++ and Rust, you must call
createBackend() / create_backend() explicitly for each backend you want to use.
For a detailed explanation of how backends interact with the Transfer Agent, Memory Sections, and Metadata Handler, see Architecture and Concepts.
Memory Types
NIXL provides a unified interface for registering and transferring data across five memory and storage types. Each backend supports a specific subset of these types.
For more on how memory types fit into the NIXL architecture, see the Overview.
Backend Support Matrix
NIXL loads each backend as a plug-in, and each plug-in supports specific memory types and transport protocols.
Common Scenarios
The table below maps common scenarios to recommended backends. NIXL selects the right backend automatically if it is initialized on both agents.
When multiple backends can handle a transfer (e.g., both UCX and Libfabric support DRAM-to-VRAM), NIXL automatically selects the most efficient one based on the available backends on both agents. You only need to ensure the desired backends are installed and initialized.
Backend plug-ins use the Southbound API exposed by the NIXL core.