Doca Urom
NVIDIAOfficialCreated by NVIDIA
- Skill
- Tool integration
- Software development
- Apache-2.0
- Medium risk
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
The doca-urom skill provides guidance for developers using the host-side DOCA UROM library to offload remote memory operations, such as puts, gets, atomics, and collectives, from the host CPU to a BlueField DPU. It focuses on the host-side implementation, including creating UROM Service and Worker contexts, discovering plugins, and managing the lifecycle of offloaded tasks. This skill assumes the user has a functional DOCA installation and a running UROM Service on the DPU, acting as a paired contract between the host library and the DPU-side executor.
What it does
- Initializes UROM Service and Worker contexts on the host.
- Enqueues remote memory operations like puts, gets, and atomics for DPU execution.
- Discovers supported operation types via plugin listing.
- Manages the DOCA progress engine for operation completions.
- Provides error taxonomy and debugging guidance for host-side UROM calls.
- Integrates with UCX-based HPC stacks to offload transport operations.
When to use it
- When offloading MPI or UCX remote memory operations to reduce host CPU load.
- When developing host-side applications that interact with the DOCA UROM library.
- When debugging connectivity or version alignment between the host library and DPU service.
- When verifying if specific atomic or collective operations are supported on the current device.
Advantages
- Reduces host CPU overhead by offloading memory operations to the DPU.
- Provides a structured approach to managing the host-DPU paired contract.
- Enables discovery of device-specific capabilities through plugin enumeration.
- Standardizes error handling and lifecycle management for UROM-based applications.
Usage examples
- “How do I offload my MPI all-reduce operation to the BlueField DPU?”
- The agent will guide you through initializing the UROM Service and Worker contexts, and using the host-side API to enqueue the collective operation for DPU execution.
- “My first doca_urom call returns DOCA_ERROR_NOT_PERMITTED. What should I check?”
- The agent will help you verify the version alignment between the host library and the DPU-side UROM service, and check the health of the underlying RDMA substrate.
- “How do I check which atomic operations are supported on my device?”
- The agent will instruct you to use doca_urom_service_get_plugins_list on a started service to discover the available plugin-defined operations.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/nvidia/doca-urom/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip doca-urom.zip -d .agents/skills
Documentation by NVIDIA
DOCA UROM
Examples
"Push UCX traffic onto the BlueField." — this is in scope. Stay on host-side
doca-urom; do not deploy the DPU-side UROM Service here."First doca_urom call returns NOT_PERMITTED." — check host/service version alignment and the RDMA substrate first.
Instructions
Follow Loading order below. Open the tasks companion for configure / offload / debug. Open the capabilities companion for service vs worker contexts. Do not open every companion file.
Where to start: This skill assumes DOCA is installed on both
host and BlueField, the DOCA UROM Service is deployed and running
on the BlueField, and the user is doing hands-on UROM work from
the host side — using doca-urom from an HPC / UCX / MPI stack
to enqueue remote memory operations (puts, gets, atomics, active
messages, collectives) the DPU executes on the host's behalf. Open
the tasks companion to do something (configure / build / modify /
run / test / debug); open the capabilities companion for what the
host-side UROM API expresses on this version + BlueField + UROM
Service version. If DOCA is not installed, route to
doca-setup/SKILL.md first; for the DPU-side
UROM Service itself (deployment, container, lifecycle), that is a
DIFFERENT artifact — route via
doca-public-knowledge-map ## DOCA services (doca-public-knowledge-map/SKILL.md#doca-services)
to the public DOCA UROM Service guide. This skill is the
host-side library; the UROM Service is the DPU-side
executor; they are a paired contract.
How to use this skill. Read this file, then search the companion file
for the ## <name> heading the question needs and read that whole section.
Answer completely from it, quoting only its symbols and commands. Do not
browse docs; use the entry points in doca-public-knowledge-map. For
out-of-scope requests, name the skill that owns them and stop.
Example questions this skill answers well
The CLASSES of UROM questions this skill answers, each with one worked example. The class is the load-bearing piece; the worked example is one instance.
"How do I offload my MPI / UCX remote memory operations from the host CPU to the BlueField?" — worked example: "my MPI all-reduce burns host CPU cycles I'd rather use for compute — how do I push that onto the BlueField via UROM?". Answered by the paired-contract model in the capabilities companion
the host-side bring-up workflow in the tasks companion.
"Is the DOCA UROM Service even running on my BlueField, and why does that matter before I write
doca_urom_*code?" — worked example: "my firstdoca_urom_*call returnsDOCA_ERROR_NOT_PERMITTEDon an otherwise-healthy host". Answered by the env-precondition matrix in the capabilities companionthe service-deployed check in the tasks companion step 1, which routes service-side env questions to
doca-public-knowledge-map ## DOCA services(doca-public-knowledge-map/SKILL.md#doca-services).
"Is this UROM operation type / atomic / collective supported on my device + DOCA install + UROM Service version?" — worked example: "does my BlueField support remote atomic Fetch-and-Add for an MPI window?". Answered by the plugin-discovery rule (
doca_urom_service_get_plugins_liston a started Service — UROM operations are plugin-defined Command tasks, so the plugins list is the capability surface) in the capabilities companionthe discovery step in the tasks companion.
"How does
doca-uromrelate todoca-rdma— am I replacing it, layering on top, or something else?" — worked example: "I already have rawdoca-rdmaworking; should I rewrite to use UROM?". Answered by the path-selection rule in the capabilities companion (UROM rides the RDMA substrate but adds the DPU-offload contract; it is the right tool only when host CPU is the bottleneck — simple point-to-point cases stay ondoca-rdma)."Is this UROM API on my installed DOCA version?" — worked example: "is the collective-ops plugin discoverable via
doca_urom_service_get_plugins_liston DOCA 3.x". Answered by the version-compatibility overlay in the capabilities companion, which cross-links the canonical detection chain indoca-version/SKILL.mdand adds the host library + DPU service versions must match overlay."What does this
DOCA_ERROR_*from adoca_urom_*call mean and which layer caused it?" — worked example: "DOCA_ERROR_NOT_PERMITTEDon the first enqueue afterdoca_ctx_start()succeeded". Answered by the UROM overlay on the cross-library taxonomy in the capabilities companionthe layered ladder in the tasks companion that escalates to
doca-debug/SKILL.md.
Audience
This skill serves external developers building HPC / UCX / MPI
applications that consume the DOCA UROM library from the host
side — code calling doca_urom_* (directly in C / C++, through
FFI / bindings, or through a UCX-based stack such as OpenMPI /
MPICH wired to use UROM as a transport) to push remote memory
operations onto the BlueField instead of the host CPU. It is not
for NVIDIA developers contributing to DOCA UROM, nor the place to
learn how to deploy / operate the UROM Service on the DPU side
— that goes through the public DOCA UROM Service guide via
doca-public-knowledge-map ## DOCA services (doca-public-knowledge-map/SKILL.md#doca-services).
Language scope. DOCA UROM ships as a host-side C library
(pkg-config module doca-urom); shipped samples under
/opt/mellanox/doca/samples/doca_urom/ are C. C / C++ consumers —
including UCX-based stacks wrapping the library — are the
canonical case the tasks companion assumes. Other-language
consumers (Rust, Go, Python, …) reach the same *.so through FFI;
the skill keeps its lifecycle, capability-discovery,
error-taxonomy, and RDMA-substrate guidance language-neutral and
routes to the public C ABI as the authoritative surface.
When to load this skill
Load this skill when the user is doing hands-on DOCA UROM work from the host side, in any language. Concretely:
Initializing a UROM Service context (
doca_urom_service_*) on adoca_devmapping to the target BlueField, creating Worker contexts (doca_urom_worker_*) attached to it, and confirming the matching DPU-side UROM Service is reachable before the first enqueue.Enqueueing remote memory operations (puts, gets, atomics, active messages, collectives) through
doca_urom_*and progressing the DOCA progress engine for completions.Calling
doca_urom_service_get_plugins_liston a started Service to discover which plugins — and therefore which operation types / atomics / collectives, since these are plugin-defined — this device + DOCA install + UROM Service version supports.Applying the UROM lifecycle, capability-discovery, and error rules to a UCX-based HPC stack (OpenMPI, MPICH, custom UCX consumer) already wired to use UROM. Designing the UCX transport integration itself remains upstream-stack work.
Debugging a
DOCA_ERROR_*fromdoca_urom_*— disambiguating DPU-side UROM Service unreachable vs operation type unsupported on this device vs plaindoca_devaccess denied vs underlying RDMA transport failure.Designing non-C bindings (Rust, Go, Python, …) that wrap the UROM C ABI and must honor the same lifecycle and error rules.
Do not load this skill for general DOCA orientation, DOCA
install, deployment / operation of the DPU-side UROM Service (a
separate artifact with its own public guide via
doca-public-knowledge-map ## DOCA services (doca-public-knowledge-map/SKILL.md#doca-services)),
or non-UROM library questions. For those, use
doca-public-knowledge-map/SKILL.md.
What this skill provides
This is a thin loader. The body keeps only the orientation needed to pick the right next file. The substantive UROM-specific material lives in two companion files:
the capabilities companion — what the host-side UROM API expresses on this version + BlueField + UROM Service version: the paired-contract model (host enqueues; DPU service executes); the two context types (
doca_urom_service— one per BlueField, bound to itsdoca_dev— and attacheddoca_urom_workercontexts); the enqueue-side operation surface (puts, gets, atomics, active messages, collectives) delivered as plugin-defined Worker Command tasks, named generically because exact symbol shapes are plugin- and install-bound; the plugin-discovery surface (doca_urom_service_get_plugins_list); the UROM error taxonomy mapped ontoDOCA_ERROR_*; the observability surface (completion events, capability snapshots, RDMA counters); and the safety policy gating env preconditions (UROM Service deployed on the DPU; host library + DPU service versions agree; RDMA-capable BlueField + DOCA install).the tasks companion — step-by-step workflows for the six in-scope UROM verbs:
configure,build,modify,run,test,debug. Plus aDeferred task verbsblock that points out-of-scope questions at the right next skill.
The skill assumes a host + BlueField pair where DOCA is installed,
the UROM Service is deployed and running on the BlueField, the RDMA
transport between them is healthy, and the user has a sketch of the
HPC / UCX / MPI stack to offload. It does not cover installing
DOCA, deploying the UROM Service container, or bringing up
RDMA / RoCE / IB transport — those go through
doca-setup/SKILL.md, the public DOCA UROM
Service guide, and doca-rdma/SKILL.md.
What this skill deliberately does not ship
This skill is agent guidance, not a samples or templates bundle. To keep the boundary clean, it deliberately does not contain — and pull requests should not add:
Pre-written DOCA UROM application source code, in any language. The verified UROM source is the shipped C samples at
/opt/mellanox/doca/samples/doca_urom/. The agent routes the user there and prescribes a minimum-diff modification via the modify-a-sample workflow indoca-programming-guide/SKILL.md, layered with the UROM overrides in the tasks companion.An MPI / UCX algorithm or collective implementation. This library offloads remote memory operations; picking which puts / gets / atomics / collectives to issue for a given MPI primitive is the user's HPC stack or domain expertise. Refuse to invent collective algorithms; route "what algorithm should my all-reduce use" to upstream MPI / UCX docs — that is a stack-design question, not a UROM API question.
Standalone build manifests (
meson.build,CMakeLists.txt,Cargo.toml, …) parked inside the skill. The agent constructs the manifest in the user's project against the installed DOCA, wherepkg-config --modversion doca-uromis the source of truth.A
samples/,bindings/, orreference/subtree of any kind. A mock artifact labeled "reference" reads as buildable and misleads.The DOCA UROM Service surface. That service is a separate artifact with its own public guide; routing lives in
doca-public-knowledge-map ## DOCA services(doca-public-knowledge-map/SKILL.md#doca-services). Conflating the library (host-side enqueue) with the service (DPU-side executor) is the most common UROM first-app design error.
Loading order
Read this skill first to confirm the user's question is in scope (host-side library work; not DPU-side service deployment, and not MPI / UCX algorithm design).
For the UROM capability matrix, the paired-contract model (host library + DPU service), the Service + Worker context model, the enqueue-side operation surface, the plugin-discovery rule, the env-precondition policy, the error taxonomy, the observability surface, and the safety policy, see the capabilities companion.
For step-by-step workflows — configure, build, modify, run, test, debug — see the tasks companion.
Both companion files cross-link to each other, to
doca-version/SKILL.md for canonical
version rules (with the UROM overlay that host library and DPU
service versions must match), to
doca-rdma/SKILL.md for the underlying RDMA
substrate, and to
doca-public-knowledge-map/SKILL.md
whenever the right answer is "look it up in the public UROM
library / Service guide or the on-disk install layout".
Related skills
doca-public-knowledge-map/SKILL.md— the routing table for every public DOCA documentation source and the on-disk layout of an installed DOCA package. The DOCA UROM library public guide is at https://docs.nvidia.com/doca/sdk/DOCA-UROM/index.html; the DOCA UROM Service is a different artifact documented separately under the DOCA services section of that map.doca-rdma/SKILL.md— the underlying RDMA transport substrate the BlueField uses to move bytes once UROM offloads an operation. UROM does NOT replace RDMA; it adds the DPU-offload contract on top. For simple point-to-point RDMA where host CPU is not the bottleneck, usedoca-rdmadirectly — UROM's service-side contract is not worth its overhead there.doca-setup/SKILL.md— env preparation, install verification, BlueField setup, and the no install yet path via the public NGC DOCA container. This skill assumes its preconditions hold AND the DPU-side UROM Service is deployed and running.doca-version/SKILL.md— canonical DOCA version-handling rules. This skill's## Version compatibilitycross-links the four-way match rule and adds the host library + DPU service must agree on version overlay.doca-structured-tools-contract/SKILL.md— the bundle's structured-tools precedence rule (detect / prefer / fall back / report). The Command appendix in the tasks companion honors this contract.doca-programming-guide/SKILL.md— general DOCA programming patterns shared by every library:pkg-config+ meson build, modify-a-shipped-sample first-app, Core-context lifecycle, the cross-libraryDOCA_ERROR_*taxonomy, and the debug order. This skill layers UROM specifics on top.doca-debug/SKILL.md— the cross-cutting debug ladder (install / version / build / link / runtime / program / driver). UROM-specific debug (UROM Service not reachable, host library + DPU service version skew, RDMA transport failure underneath, operation type unsupported on this device + firmware + service version) overlays on top.
The DOCA UROM Service running on the DPU side is deliberately
not in scope — a separate artifact with its own public guide
via
doca-public-knowledge-map ## DOCA services (doca-public-knowledge-map/SKILL.md#doca-services).
Conflating the library and the service is the single most common
UROM first-app design error: surface the split explicitly whenever
a question straddles the two.
Files
- ATTRIBUTION.mdAdded by AutoGineer885 B
- BENCHMARK.md11.2 KiB
- CAPABILITIES.md34.2 KiB
- LICENSELicence file added by AutoGineer11.2 KiB
- SKILL.md16.3 KiB
- SKILLCARD.yaml2.6 KiB
- TASKS.md35.2 KiB
- evals/evals.json2.5 KiB
- skill-card.md5.2 KiB
- skill.oms.sig5.1 KiB
CAPABILITIES.md
DOCA UROM capabilities, version overlay, errors, observability, safety
Where to start: Pick the H2 anchor that matches your question (paired-contract model / Service + Worker context model / enqueue-side operation surface / plugin discovery / env preconditions / errors) and read that section end-to-end. The tables in each section are the load-bearing content; the prose around them is interpretation.
Read this file when the loader sent you here from
SKILL.md. For the how of executing each pattern
(the verbs configure / build / modify / run / test / debug),
jump to TASKS.md. For the canonical DOCA
version-handling rules that this skill layers a UROM overlay on
top of, see doca-version/SKILL.md. For
the RDMA transport substrate UROM rides on top of, see
doca-rdma/SKILL.md.
Pattern overview
Every UROM question this skill teaches resolves into one of SIX patterns. The patterns are CLASSES — they apply across every DOCA UROM release and every host + BlueField + UROM Service combination.
| Pattern | When it applies (class shape) | Where the substance lives |
|---|---|---|
| 1. Walk the paired-contract model first | Every UROM deployment has TWO components (host-side doca-urom library + DPU-side DOCA UROM Service); the host enqueues, the DPU executes; both must be present at compatible versions before the first enqueue | ## Capabilities and modes paired-contract table + TASKS.md ## configure step 1 |
| 2. Create the Service context, then the Worker contexts | One doca_urom_service per BlueField (bound to its doca_dev); one or more doca_urom_worker contexts attached to that Service via doca_urom_worker_set_service; both follow the standard DOCA Core lifecycle on the host side | ## Capabilities and modes Service+Worker context rules + TASKS.md ## configure steps 4 (Service) and 6 (Workers) |
| 3. Enqueue the right operation kind | UROM operations are plugin-defined Worker Command tasks (doca_urom_worker_cmd_task_*); the agent picks the right plugin by direction and semantics: put / get (one-sided data movement) vs atomic (compare-swap, fetch-add) vs active message vs collective primitive (used by MPI / UCX stacks for all-to-all, all-reduce, …) — exact command symbol names are plugin- and install-bound and must be read from the headers, not quoted from memory | ## Capabilities and modes operation-shape table + TASKS.md ## modify |
| 4. Honor env preconditions: DPU-side UROM Service running, RDMA substrate healthy, versions matched | The library cannot offload to a service that is not running; the BlueField cannot move bytes without the RDMA transport substrate; host library + DPU service versions must agree per the DOCA Compatibility Policy | ## Safety policy env-precondition matrix + TASKS.md ## configure step 1 |
5. Choose doca-urom only when host-CPU offload is actually the goal | Simple point-to-point RDMA stays on doca-rdma; non-MPI / non-UCX stacks may not benefit; UROM adds the DPU-offload contract that is only worth its overhead when host CPU is the bottleneck | ## Capabilities and modes path-selection rule + ## Deferred topic boundaries |
| 6. Diagnose a UROM error | Map DOCA_ERROR_NOT_SUPPORTED / _NOT_PERMITTED / _INVALID_VALUE / _BAD_STATE / _IO_FAILED / _AGAIN to root cause without leaving the UROM layer prematurely | ## Error taxonomy + TASKS.md ## debug |
Two cross-cutting rules that apply to every pattern above:
The paired-contract model is non-negotiable. Every UROM deployment is two components: the host-side library (this skill,
doca-urom) that ENQUEUES offloaded operations AND the DPU-side DOCA UROM Service that EXECUTES them. An agent that treats the host side as self-sufficient — for example by walking the user fromdoca_urom_*calls directly into on-wire behavior without checking the DPU-side service is even running — has the model wrong for every version of UROM. A library call that succeeds at the host-side API surface but has no service to offload to fails at the first enqueue, often with aDOCA_ERROR_NOT_PERMITTEDthat masks the real cause.Discover the version-installed + service-installed surface, do not assume. Every pattern above gates on
pkg-config --modversion doca-urom(host-side build-time), thedoca_urom_service_get_plugins_listquery against a started Service (host-side runtime — UROM has nodoca_urom_cap_*devinfo capability family; the supported plugins discovered on the DPU side ARE the capability surface), AND the DPU-side UROM Service's version reachable from the host. Quoting an operation type, an atomic op, or a collective primitive without checking those three is the most common hallucination failure mode for UROM. Exact symbol names for the operation surface are plugin- and install-bound and must be read from the headers under $(pkg-config --variable=includedir doca-common) and from the shipped samples under/opt/mellanox/doca/samples/doca_urom/, not quoted from memory.
Capabilities and modes
The two orthogonal selection axes for any UROM design from the
host side are which BlueField the host is offloading to (a
doca_urom_service bound, via doca_urom_service_set_dev, to
the doca_dev that maps to a BlueField running the DOCA UROM
Service) and which operation kind the HPC / UCX / MPI stack on
top wants offloaded (one-sided data movement, atomic, active
message, collective primitive — each delivered by a plugin the
Worker loads). Choose both before writing any host-side enqueue
code, then drill into the plugin-discovery step.
Paired-contract model — the host library and the DPU service.
| Side | What runs there | Artifact | What this skill covers |
|---|---|---|---|
| Host side | C / C++ (or any language that can FFI a C library) using doca-urom to enqueue remote memory operations, integrated into the user's HPC / UCX / MPI stack on the host | doca-urom library (this skill); pkg-config doca-urom is the canonical build-time anchor | All of ## Capabilities and modes / ## Error taxonomy / ## Observability / ## Safety policy below |
| DPU side | The DOCA UROM Service — a long-running daemon / container on the BlueField Arm side that receives the host's enqueued operations and EXECUTES them against the remote-side memory and RDMA fabric, freeing the host CPU | DOCA UROM Service — a SEPARATE artifact with its own public guide reachable through doca-public-knowledge-map ## DOCA services (doca-public-knowledge-map/SKILL.md#doca-services) | This skill NAMES the service and routes to its guide; it does NOT redefine the service surface or its deployment / operation. A doca-urom host program with no UROM Service running on the DPU side fails at the first enqueue |
The agent's rule: when the user asks "how do I deploy / start /
stop / scale the DOCA UROM Service on my BlueField", that is
the DPU-side service question and the right artifact is the
public DOCA UROM Service guide via
doca-public-knowledge-map ## DOCA services (doca-public-knowledge-map/SKILL.md#doca-services).
When the user asks "how do I enqueue an operation from my host
code and observe its completion", that is this skill's scope.
Two distinct artifacts; two distinct surfaces.
Path selection — doca-urom vs raw doca-rdma vs neither.
Before any doca-urom setup, the agent must confirm UROM is
even the right path:
| User intent | Right artifact | Why this skill is / isn't it |
|---|---|---|
| Simple point-to-point RDMA between two endpoints; host CPU is not the bottleneck | doca-rdma directly (this skill is the WRONG path) — UROM adds a DPU-side service contract whose overhead isn't worth it for a single-pair / small / simple data movement case | doca-urom makes sense only when the host CPU's cost of posting RDMA work is itself the bottleneck (HPC collectives, repeated all-to-all / all-reduce, dense MPI patterns) — not for one-shot send / recv |
| HPC / MPI / UCX workload where host CPU spends a lot of cycles on communication and you want the BlueField to take over | doca-urom (this skill), with the DPU-side UROM Service deployed and running | This is the canonical UROM use case: the host frees its CPUs for compute and the BlueField DPU does the communication work via its on-DPU RDMA + offload pipeline |
| Non-MPI, non-UCX networking stack; host CPU is not heavily loaded on communication | None of this skill — UROM offers no benefit and adds operational complexity. Stay on whatever transport the user's stack already uses; route to doca-rdma/SKILL.md if RDMA is in play | UROM's HPC / collective shape is its load-bearing benefit; stacks that don't issue those patterns get the overhead without the upside |
The two host-side context types — a doca_urom_service per
BlueField, and the doca_urom_worker contexts attached to it.
There is NO single doca_urom Core context and no
doca_urom_create; the host-side model is two distinct DOCA
Core contexts.
| Object | Lifetime | What it owns | Key calls |
|---|---|---|---|
doca_urom_service | One per BlueField the host is offloading to; created with doca_urom_service_create, bound to a doca_dev via doca_urom_service_set_dev, started via doca_ctx_start(doca_urom_service_as_ctx(service)) | The connection to the DPU-side UROM Service, the set of Workers it manages on the device, and the discovery of which plugins the DPU supports | doca_urom_service_create / doca_urom_service_set_dev / doca_urom_service_set_max_workers / doca_urom_service_set_max_comm_msg_size; doca_urom_service_as_ctx (for the DOCA Core lifecycle); doca_urom_service_get_plugins_list for what the DPU side supports; doca_urom_service_destroy |
doca_urom_worker | One or more per Service; a process spawned on the DPU; created with doca_urom_worker_create, attached to a Service via doca_urom_worker_set_service, started via doca_ctx_start(doca_urom_worker_as_ctx(worker)) | The host-side handle to a worker process on the DPU, the set of plugins it runs (doca_urom_worker_set_plugins), and the in-flight Command tasks submitted to it | doca_urom_worker_create / doca_urom_worker_set_service / doca_urom_worker_set_id / doca_urom_worker_set_plugins / doca_urom_worker_set_max_inflight_tasks; doca_urom_worker_as_ctx; doca_urom_worker_cmd_task_* to enqueue work; doca_urom_worker_destroy |
A host driving UROM toward more than one BlueField needs one
doca_urom_service per target BlueField — there is no "global
UROM context". The agent must ask which BlueField (which
doca_dev, mapping to which physical BlueField actually
running the UROM Service) the user intends to offload to before
recommending any doca_urom_service_* / doca_urom_worker_*
call. (An optional doca_urom_domain coordinates multiple
Workers for plugins that implement a parallel communication
model.)
Enqueue-side operation surface — plugin-defined Command tasks;
exact symbols are plugin- and install-bound. The host enqueues
work to a Worker as a Command task (doca_urom_worker_cmd_task_*)
whose payload is interpreted by the plugin the Worker loaded; the
loaded plugin running under the UROM Service on the DPU side
actually executes it. The operation families below are therefore
plugin families, not a fixed library call set. The agent must
NAME the operation families and route to the plugin headers +
samples for exact symbol names — quoting specific operation
function names from memory is the most common hallucination
failure mode for UROM.
| Operation family | Direction / semantics | Right shape for | Notes for the agent |
|---|---|---|---|
| Put / Get (one-sided data movement) | One-sided remote memory write / read; same family of operation that doca-rdma Write / Read implements but enqueued through a UROM plugin Command task so the BlueField DPU posts the underlying RDMA work, not the host CPU | MPI / UCX windows; bulk data movement where the host CPU otherwise spends cycles posting verbs | Per-operation memory descriptor + remote handle + payload size are the agent-visible inputs; exact command symbol must be read from the plugin's headers |
| Atomic (compare-and-swap, fetch-and-add) | One-sided atomic; same family of operation that doca-rdma Atomic ops implement but DPU-offloaded via a plugin | MPI atomic windows; lock-free distributed data structures | Device-conditional per row; not every BlueField + DOCA + UROM Service combo loads the plugin that provides every atomic — the doca_urom_service_get_plugins_list result is the only authoritative answer |
| Active message | The host-side enqueue carries a payload and a remote-side handler identifier; the DPU executes the matching handler on the remote side | UCX active messages; control-plane messages alongside the data plane within the same Worker | Service-side handler registration is part of the DPU service / plugin surface and is reachable via the public DOCA UROM Service guide; the agent must not invent handler-registration symbols on the host side |
| Collective primitive (all-to-all, all-reduce, broadcast, …) | Many-to-many remote memory operations expressed as a single host-side enqueue that the DPU plugin expands into the underlying per-pair RDMA traffic | MPI collectives; UCX-based collective offload | Service-side capability — not every UROM Service version ships the collective plugin. The agent must NAME the family and route to the plugins-list query, not quote which collective is on this install from memory |
The agent's rule: when the user asks "what is the exact
function name for a UROM put / atomic / collective", the
authoritative answer is the header under
$(pkg-config --variable=includedir doca-common) and the shipped
sample under /opt/mellanox/doca/samples/doca_urom/ on the
user's install, NOT this skill or agent memory.
Plugin discovery — the only rule. UROM has NO
doca_urom_cap_* / doca_urom_cap_get_* devinfo capability
family. The capability surface is the list of plugins the DPU
side supports, discovered by calling
doca_urom_service_get_plugins_list on a STARTED Service
(DOCA_ERROR_BAD_STATE if the Service is not running):
| Capability axis | How to discover | Why the agent must ask |
|---|---|---|
| Which operation families are available | doca_urom_service_get_plugins_list(service, &plugins, &count) on a started Service; each entry describes a supported plugin | Operation families (put / get, atomic, collective, active message) are provided by plugins; a family is available only if the DPU side loaded the plugin that implements it — do not assume universal availability |
| Selecting a plugin for a Worker | Match the discovered plugin's id, then pass its index bitmask to doca_urom_worker_set_plugins before starting the Worker | A Worker can only issue Command tasks for the plugins it loaded; the plugin index used in doca_urom_worker_cmd_task_* comes from the discovered list |
| Maximum payload / message sizing | Set the UROM comm-channel limit with doca_urom_service_set_max_comm_msg_size; size per-Worker in-flight depth with doca_urom_worker_set_max_inflight_tasks | These setters bound the Command task payload and the in-flight queue depth; the AGAIN (queue-full) error rate at runtime is proportional to an undersized max_inflight_tasks |
Configuration shape. Mandatory preconditions before
doca_ctx_start() on the Service and then on each Worker: the
DPU-side UROM Service is deployed and running on the BlueField
the host intends to offload to; the doca_urom_service is bound
via doca_urom_service_set_dev to a doca_dev that maps to that
BlueField; the user / process can open that doca_dev;
doca_urom_service_get_plugins_list (on the started Service)
shows the plugin for the operation family the user intends to
enqueue, and the Worker selected it via
doca_urom_worker_set_plugins. Optional configurations
(doca_urom_worker_set_max_inflight_tasks,
doca_urom_service_set_max_workers, transport-type knobs
inherited from the RDMA substrate) ride on top of the same
plugin-discovery rule.
Version compatibility
For the canonical DOCA version-detection chain, the four-way
match rule, NGC container semantics, and the headers-win-over-docs
rule, see doca-version/SKILL.md. The
body lives there; this skill does not duplicate it.
The UROM-specific overlay is:
The host-side library version and the DPU-side UROM Service version must agree per the DOCA Compatibility Policy. This is the paired-contract version axis the agent must ALWAYS surface: a host-side
doca-uromupgraded without the DPU-side UROM Service being upgraded (or vice versa) fails at the first enqueue, often withDOCA_ERROR_NOT_SUPPORTEDfor an operation family that DOES exist on one side but not the other. Surface BOTHpkg-config --modversion doca-uromon the host AND the DPU-side service version (per the public DOCA UROM Service guide viadoca-public-knowledge-map ## DOCA services(doca-public-knowledge-map/SKILL.md#doca-services)); cross-check them against the DOCA Compatibility Policy. This skill provides no host-side command for obtaining the DPU-side version: obtain it through the service guide, and stop rather than claim a compatible pair if it cannot be obtained. Per the cross-cutting discovery rule indoca-version CAPABILITIES.md ## Observability(doca-version/CAPABILITIES.md#observability), thedoca_urom_service_get_plugins_listresult on a started Service is the runtime authority for "is this operation family's plugin available on this hardware + this DOCA install + this UROM Service", and the four-way-match check (doca-urom.pc+doca-common.pc+doca_caps --version) perdoca-version CAPABILITIES.md ## Version compatibility(doca-version/CAPABILITIES.md#version-compatibility) validates only the host-side install; it does not prove that the DPU-side service version matches.
Error taxonomy
UROM-specific overlays on the cross-library DOCA_ERROR_*
taxonomy. The cross-library taxonomy itself lives in
doca-programming-guide CAPABILITIES.md ## Error taxonomy (doca-programming-guide/CAPABILITIES.md#error-taxonomy);
the rows below are the UROM surface meaning that the agent
must disambiguate before falling back to the cross-library
response.
| Error | UROM context where it shows up | UROM-specific cause |
|---|---|---|
DOCA_ERROR_BAD_STATE | Any doca_urom_* call before doca_ctx_start() or after doca_ctx_stop(); enqueue called before the context is healthy | Lifecycle violation. Walk the call sequence against the universal Core lifecycle in doca-programming-guide CAPABILITIES.md ## Capabilities and modes (doca-programming-guide/CAPABILITIES.md#capabilities-and-modes); the most common case is enqueueing before the context has finished starting or progressing the PE. |
DOCA_ERROR_NOT_SUPPORTED | doca_urom_worker_set_plugins / first Command task of a specific operation family / atomic / collective | The plugin providing that operation kind is not loaded on this device + this DOCA install + this UROM Service version. Re-run doca_urom_service_get_plugins_list on the started Service; surface BOTH the host-side library version AND the DPU-side service version, because mismatch on either side can produce this error. If the plugins list confirms the plugin is absent, that is the answer — do not paper over with a retry. |
DOCA_ERROR_INVALID_VALUE | Enqueue with a bad memory descriptor, mismatched remote handle, or oversized payload | The user's memory descriptor (local buffer, remote handle, length, offset) does not validate. Re-check that the local buffer was registered correctly, the remote handle came from the matching peer's export step, and the payload size fits within the comm-channel limit set by doca_urom_service_set_max_comm_msg_size. Do not retry; fix the descriptor. |
DOCA_ERROR_NOT_PERMITTED | doca_urom_service_create / doca_ctx_start on the Service or Worker; first enqueue | Either the standard doca_dev access is missing (the user / process cannot open the target doca_dev — same baseline as every other DOCA library), OR — and this is the UROM-specific case the agent MUST surface — the DPU-side UROM Service is not deployed and running on the target BlueField (or it is running but at a version the host library cannot pair with). The two look identical at the doca-urom API surface; the fix is different. Check both explicit preconditions: whether the process can enumerate and open the target doca_dev, and whether the DPU-side service is running at a compatible version. doca_dev access is a host-OS / group-membership fix per doca-setup ## Safety policy (doca-setup/CAPABILITIES.md#safety-policy); the service-side case routes through the public DOCA UROM Service guide reachable via doca-public-knowledge-map ## DOCA services (doca-public-knowledge-map/SKILL.md#doca-services). Do not choose either cause from this API error alone. |
DOCA_ERROR_IO_FAILED | Any enqueue / completion call | The underlying RDMA transport substrate UROM rides on top of has reported failure. UROM does NOT replace RDMA — it offloads the posting of RDMA work onto the BlueField DPU. A failing RDMA fabric (link down, RoCE / IB config skew, routing issue between nodes) surfaces as DOCA_ERROR_IO_FAILED at the UROM API. Route to doca-rdma ## debug (doca-rdma/TASKS.md#debug) for the substrate-layer diagnosis BEFORE assuming the UROM library or service is at fault. |
DOCA_ERROR_AGAIN | Enqueue when the Worker's in-flight task queue is full | This is not a hardware error; the program must drain completions via doca_pe_progress() before re-submitting. Same as the cross-library "would-block, retry after progress" pattern; the fix is to raise doca_urom_worker_set_max_inflight_tasks at configure time OR to drain more aggressively on the host loop. |
The agent's rule: never recommend a retry loop on
DOCA_ERROR_* without first identifying which of the rows
above is the cause. _AGAIN is the only one that wants a
retry (after doca_pe_progress()); the others want
investigation — service-side, lifecycle, version-axis, RDMA
substrate, or memory descriptor — not retry.
Observability
UROM observability surface is two-sided: there is a
host-side observability surface (operation completions on the
DOCA progress engine, the DOCA logger, capability snapshots
from doca_urom_service_get_plugins_list) AND an infrastructure-side
observability surface (the DPU-side UROM Service's own
observability documented in the public DOCA UROM Service
guide via
doca-public-knowledge-map ## DOCA services (doca-public-knowledge-map/SKILL.md#doca-services),
plus the underlying RDMA substrate counters documented in
doca-rdma CAPABILITIES.md ## Observability (doca-rdma/CAPABILITIES.md#observability)).
The agent must reach for both, not just one — a UROM enqueue
that returns DOCA_SUCCESS on the host side but produces no
visible remote-side effect is almost always visible on one of
the infrastructure-side surfaces.
Three primary signals the agent should reach for:
Per-operation completion events on the DOCA progress engine. Every enqueued operation produces a completion event when it finishes (or errors) — the completion carries the
doca_error_tif it failed. The host must inspect the per-operation completion, not just the return value of the enqueue call. Submitted but no completion is almost always either a missingdoca_pe_progress()call in the host loop OR a DPU-side service that has stopped processing enqueues (route to the public service guide).Plugin snapshot at configure time. The output of
doca_urom_service_get_plugins_liston the started Service, together withpkg-config --modversion doca-uromon the host and the DPU-side UROM Service version, is the baseline of "what the library + the hardware + the DPU service said was possible" before any enqueue. Save it; if an enqueue later returnsDOCA_ERROR_NOT_SUPPORTEDthe diff against this baseline is the bug.Infrastructure-side: DPU service observability + RDMA substrate counters. When the host-side surface shows operations completing cleanly but the user reports the remote-side memory does not have the expected bytes, the right diagnostic is the DPU-side UROM Service's own observability (reach via the public service guide through
doca-public-knowledge-map ## DOCA services(doca-public-knowledge-map/SKILL.md#doca-services)) PLUS the underlying RDMA counters (perdoca-rdma CAPABILITIES.md ## Observability(doca-rdma/CAPABILITIES.md#observability)). The agent must NAME the existence of both surfaces and route the user there; the per-surface details belong in their owning skills / guides.
For cross-cutting observability primitives (--sdk-log-level,
the DOCA_LOG_LEVEL env var, the trace build flavor) see
doca-debug CAPABILITIES.md ## Observability (doca-debug/CAPABILITIES.md#observability).
For the install-tree observability (logger names, package
layout, sample tree) defer to
doca-public-knowledge-map/SKILL.md.
Safety policy
Overlay on the bundle-wide hardware-safety meta-policy. The rules below are this skill's per-artifact overlay on the cross-cutting rules in
doca-hardware-safetyCAPABILITIES.md ## Safety policy (doca-hardware-safety/CAPABILITIES.md#safety-policy) (specifically ### Per-artifact overlay pattern (doca-hardware-safety/CAPABILITIES.md#per-artifact-overlay-pattern)). When the two layers disagree, the stricter wins; when either layer says STOP, the agent stops.
UROM's safety surface is env-precondition-driven AND
paired-contract-driven AND RDMA-substrate-driven. The three
most common UROM first-app failures are (1) the DPU-side UROM
Service is not deployed and running on the BlueField the host
is enqueueing to; (2) the host-side library and the DPU-side
service are at versions the DOCA Compatibility Policy does not
support pairing; (3) the underlying RDMA fabric between host
and BlueField (or between BlueFields, for multi-node HPC) is
not healthy. The agent's job is to verify all three before any
host-side doca_urom_* enqueue, not after the first
DOCA_ERROR_*.
The env-precondition matrix the agent must walk for any new host-side UROM setup:
| Precondition | What must be true | How the agent verifies | Where to fix |
|---|---|---|---|
| DOCA UROM Service deployed and running on the target BlueField | The DPU-side service is present on the BlueField, started, and reachable from the host through the DOCA contract — the host library cannot offload to a service that is not there | Per the public DOCA UROM Service guide via doca-public-knowledge-map ## DOCA services (doca-public-knowledge-map/SKILL.md#doca-services); the agent must NAME this precondition explicitly even though the exact service health check sits in the service guide. A doca_urom_service_create succeeding while the first enqueue returns DOCA_ERROR_NOT_PERMITTED strongly suggests the service is missing | The public DOCA UROM Service guide; this is not a host-side code fix |
| Host library and DPU service versions agree | pkg-config --modversion doca-urom on the host AND the DPU-side service version are at versions the DOCA Compatibility Policy lists as compatible | pkg-config --modversion doca-urom; obtain the DPU-side service version through the public service guide; cross-check both against the DOCA Compatibility Policy. This skill has no host-side command for the service version, so stop if that value cannot be obtained; the host-side four-way-match check in doca-version CAPABILITIES.md ## Version compatibility (doca-version/CAPABILITIES.md#version-compatibility) does not prove the service match | doca-setup/SKILL.md for the install-side; route to doca-version/SKILL.md for the four-way-match check |
| Underlying RDMA transport is healthy | UROM rides on top of doca-rdma (or the matching RDMA / RoCE / IB substrate the BlueField is configured for); the underlying fabric must be up before UROM can offload anything | Per doca-rdma TASKS.md ## configure (doca-rdma/TASKS.md#configure); the agent must NAME RDMA as the substrate explicitly, because a failing RDMA fabric will surface as DOCA_ERROR_IO_FAILED at the UROM API and the user will incorrectly attribute it to UROM | doca-rdma ## debug (doca-rdma/TASKS.md#debug) for the substrate-layer fix; do not attempt to mask RDMA-layer failures inside the host UROM program |
Standard DOCA doca_dev access | The user / process can open the target doca_dev for the BlueField — same baseline DOCA access rule as every other DOCA library; typically requires sudo or membership in the host's standard mlnx-style group | The DOCA doca_dev enumeration succeeds for the target device; if it does not, that is an env-side problem | doca-setup/SKILL.md for the env-side; do not modify the program |
| Plugin for the operation family present at configure time | doca_urom_service_get_plugins_list on the started Service shows the plugin for the operation family / atomic / collective the user intends to enqueue, and the Worker selected it via doca_urom_worker_set_plugins | Walk the plugin-discovery step in ## Capabilities and modes; save the result as the baseline | Diagnose the gap (device too old / DOCA too old / UROM Service too old / plugin genuinely absent), not paper over with a retry |
| Single small smoke succeeded before scaling to collectives | One put + one get round-trip between two nodes succeeds and the completion event fires on the host-side PE, BEFORE the user attempts a full collective pattern (all-to-all, all-reduce) | Walk the smoke step in TASKS.md ## test step 1; a smoke that fails identifies service-side, RDMA-substrate, version-axis, or memory-descriptor gaps cheaply, before any HPC stack integration effort is wasted | Diagnose the smoke failure first; do NOT scale a broken smoke into a full collective pattern |
Do not invent a "host-CPU fallback" for UROM. UROM's entire
reason to exist is to remove host-CPU work from the
communication path. If the DPU-side UROM Service is not running
or is at the wrong version, the right answer is to fix that —
NOT to silently fall back to raw doca-rdma posted from the
host CPU. A fallback that masks the missing service produces an
HPC stack whose offload claims are silently wrong; the agent
must surface the service-side gap, not paper over it.
Lifecycle ordering is UROM-aware. The Worker contexts must
be stopped and destroyed (doca_urom_worker_destroy) before the
Service they are attached to is stopped and destroyed
(doca_urom_service_destroy); both follow the universal DOCA
Core teardown order on top of the doca_dev. Out-of-order
teardown surfaces as DOCA_ERROR_BAD_STATE (or
DOCA_ERROR_IN_USE when Workers are still attached) on
subsequent calls and may leave DPU-side resources (memory
registrations, worker processes, completion queues)
half-released that the next doca_urom_service_create on the
same device then has to recover from. The agent must surface
this ordering explicitly. If a later create reports
DOCA_ERROR_BAD_STATE or DOCA_ERROR_IN_USE after an
out-of-order teardown, stop blind retries and route recovery to
the public DOCA UROM Service guide; this host-library skill
does not define a service-side cleanup command.
This skill does not define an HPC algorithm. doca-urom
offloads remote memory operations; it does not implement an
MPI collective, a UCX active message handler, or any
particular HPC stack algorithm. When the user asks "what
all-reduce algorithm should I use" or "how do I implement my
collective", the agent must refuse to invent an algorithm and
must route the user to the upstream MPI / UCX documentation
and to the user's own HPC domain expertise.
Deferred topic boundaries
This skill scopes itself to the host-side doca-urom
library for HPC / UCX / MPI workloads offloading remote memory
operations to the BlueField DPU. Adjacent topics the agent will
get asked but should route elsewhere:
DOCA UROM Service deployment and operation on the DPU side — a SEPARATE artifact with its own public guide; route via
doca-public-knowledge-map ## DOCA services(doca-public-knowledge-map/SKILL.md#doca-services). Conflating the library and the service is the single most common UROM first-app design error: the agent must NAME the split explicitly whenever the question straddles the two.MPI / UCX / HPC collective algorithm design itself — out of scope. Route to the upstream MPI / UCX documentation; this skill assumes the user has the algorithmic shape they want and is asking how to express the underlying remote memory operations through UROM.
Setting up the RDMA / RoCE / IB transport substrate UROM rides on top of — owned by
doca-rdma/SKILL.md. UROM uses the RDMA substrate; it does not stand it up. A UROM deployment over a broken RDMA fabric is a substrate problem, not a UROM bug.DOCA Core context and progress engine internals — owned by
doca-programming-guide/SKILL.md. This skill uses the Core lifecycle; it does not redefine it.Cross-library
DOCA_ERROR_*taxonomy — owned bydoca-programming-guide CAPABILITIES.md ## Error taxonomy(doca-programming-guide/CAPABILITIES.md#error-taxonomy). This skill adds the UROM overlay, not the taxonomy itself.Cross-cutting debug ladder (install / version / build / link / runtime / program / driver) — owned by
doca-debug ## debug(doca-debug/TASKS.md#debug). This skill's## debugredirects there for layer 1-4 and layer 7; layers 5-6 carry the UROM-specific overlay (including the DPU-side-service-not-running route and the RDMA-substrate route).Cross-library
doca_capsinvocation patterns — owned bydoca-public-knowledge-map/SKILL.md. This skill references the UROM plugin-discovery surface (doca_urom_service_get_plugins_list), which is per-library; the cross-library capability snapshot tool (doca_caps --list-devs) is a separate surface routed via the public knowledge map.
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
The author says: Requires DOCA SDK installed at /opt/mellanox/doca on Linux (Ubuntu 22.04/24.04 or RHEL/SLES) on a host paired with a BlueField DPU running the DOCA UROM Service at a compatible version. Reads the user's local install via `pkg-config doca-urom` and inspects /opt/mellanox/doca/{lib,include,samples,applications}; underlying RDMA fabric between host and BlueField must be healthy. The validation steps require a live DOCA install.
Security
What our scanner noticed· Medium risk
- Large base64-encoded blobs
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- NVIDIA
- Publisher
- NVIDIA (Official)
- Source
- NVIDIA/skills · skills/doca-urom · commit fce3cca
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE-APACHE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by NVIDIA.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download doca-urom.zip