Generated banner for Doca Urom
Generated logo for Doca Urom

Doca Urom

NVIDIAOfficialCreated by NVIDIA

  • Skill
  • Tool integration
  • Software development
  • Apache-2.0
  • Medium risk

From the author

Host-side DOCA UROM library (doca_urom_*): offload an HPC / UCX / MPI application's remote memory operations (puts, gets, atomics, collectives) from the host CPU onto a BlueField DPU. Trigger on "MPI all-reduce burning host CPU", "push UCX traffic onto the BlueField", "first doca_urom call returns NOT_PERMITTED", or "host library and DPU service look out of sync", even without naming DOCA UROM. An offload needs both halves: this host library and the UROM Service on the DPU (doca-urom-svc), which owns deploying that container. Covers creating UROM Service contexts (doca_urom_service_*) and Worker contexts (doca_urom_worker_*) that run plugins on the DPU, discovering plugins via doca_urom_service_get_plugins_list, progressing completions, and DOCA_ERROR_* from doca_urom_* calls. Route elsewhere for UROM Service deployment on the DPU side, MPI / UCX collective algorithm design, and RDMA / RoCE / IB substrate bring-up.
— the description by NVIDIA

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

  1. Download the skill as a ZIP:

    https://mp-staging.autogineer.com/agent-skills/nvidia/doca-urom/download
  2. Unzip 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 first doca_urom_* call returns DOCA_ERROR_NOT_PERMITTED on an otherwise-healthy host". Answered by the env-precondition matrix in the capabilities companion

    • the 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_list on a started Service — UROM operations are plugin-defined Command tasks, so the plugins list is the capability surface) in the capabilities companion

    • the discovery step in the tasks companion.

  • "How does doca-urom relate to doca-rdma — am I replacing it, layering on top, or something else?" — worked example: "I already have raw doca-rdma working; 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 on doca-rdma).

  • "Is this UROM API on my installed DOCA version?" — worked example: "is the collective-ops plugin discoverable via doca_urom_service_get_plugins_list on DOCA 3.x". Answered by the version-compatibility overlay in the capabilities companion, which cross-links the canonical detection chain in doca-version/SKILL.md and adds the host library + DPU service versions must match overlay.

  • "What does this DOCA_ERROR_* from a doca_urom_* call mean and which layer caused it?" — worked example: "DOCA_ERROR_NOT_PERMITTED on the first enqueue after doca_ctx_start() succeeded". Answered by the UROM overlay on the cross-library taxonomy in the capabilities companion

    • the 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 a doca_dev mapping 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_list on 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_* from doca_urom_* — disambiguating DPU-side UROM Service unreachable vs operation type unsupported on this device vs plain doca_dev access 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 its doca_dev — and attached doca_urom_worker contexts); 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 onto DOCA_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 a Deferred task verbs block 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 in doca-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, where pkg-config --modversion doca-urom is the source of truth.

  • A samples/, bindings/, or reference/ 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

  1. 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).

  2. 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.

  3. 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".

  • 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, use doca-rdma directly — 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 compatibility cross-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-library DOCA_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

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.

PatternWhen it applies (class shape)Where the substance lives
1. Walk the paired-contract model firstEvery 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 contextsOne 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 kindUROM 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 matchedThe 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 goalSimple 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 errorMap 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 from doca_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 a DOCA_ERROR_NOT_PERMITTED that 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), the doca_urom_service_get_plugins_list query against a started Service (host-side runtime — UROM has no doca_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.

SideWhat runs thereArtifactWhat this skill covers
Host sideC / 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 hostdoca-urom library (this skill); pkg-config doca-urom is the canonical build-time anchorAll of ## Capabilities and modes / ## Error taxonomy / ## Observability / ## Safety policy below
DPU sideThe 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 CPUDOCA 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 intentRight artifactWhy this skill is / isn't it
Simple point-to-point RDMA between two endpoints; host CPU is not the bottleneckdoca-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 casedoca-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 overdoca-urom (this skill), with the DPU-side UROM Service deployed and runningThis 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 communicationNone 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 playUROM'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.

ObjectLifetimeWhat it ownsKey calls
doca_urom_serviceOne 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 supportsdoca_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_workerOne 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 itdoca_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 familyDirection / semanticsRight shape forNotes 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 CPUMPI / UCX windows; bulk data movement where the host CPU otherwise spends cycles posting verbsPer-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 pluginMPI atomic windows; lock-free distributed data structuresDevice-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 messageThe host-side enqueue carries a payload and a remote-side handler identifier; the DPU executes the matching handler on the remote sideUCX active messages; control-plane messages alongside the data plane within the same WorkerService-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 trafficMPI collectives; UCX-based collective offloadService-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 axisHow to discoverWhy the agent must ask
Which operation families are availabledoca_urom_service_get_plugins_list(service, &plugins, &count) on a started Service; each entry describes a supported pluginOperation 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 WorkerMatch the discovered plugin's id, then pass its index bitmask to doca_urom_worker_set_plugins before starting the WorkerA 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 sizingSet 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_tasksThese 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-urom upgraded without the DPU-side UROM Service being upgraded (or vice versa) fails at the first enqueue, often with DOCA_ERROR_NOT_SUPPORTED for an operation family that DOES exist on one side but not the other. Surface BOTH pkg-config --modversion doca-urom on the host AND the DPU-side service version (per the public DOCA UROM Service guide via doca-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 in doca-version CAPABILITIES.md ## Observability (doca-version/CAPABILITIES.md#observability), the doca_urom_service_get_plugins_list result 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) per doca-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.

ErrorUROM context where it shows upUROM-specific cause
DOCA_ERROR_BAD_STATEAny doca_urom_* call before doca_ctx_start() or after doca_ctx_stop(); enqueue called before the context is healthyLifecycle 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_SUPPORTEDdoca_urom_worker_set_plugins / first Command task of a specific operation family / atomic / collectiveThe 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_VALUEEnqueue with a bad memory descriptor, mismatched remote handle, or oversized payloadThe 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_PERMITTEDdoca_urom_service_create / doca_ctx_start on the Service or Worker; first enqueueEither 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_FAILEDAny enqueue / completion callThe 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_AGAINEnqueue when the Worker's in-flight task queue is fullThis 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:

  1. 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_t if 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 missing doca_pe_progress() call in the host loop OR a DPU-side service that has stopped processing enqueues (route to the public service guide).

  2. Plugin snapshot at configure time. The output of doca_urom_service_get_plugins_list on the started Service, together with pkg-config --modversion doca-urom on 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 returns DOCA_ERROR_NOT_SUPPORTED the diff against this baseline is the bug.

  3. 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 (per doca-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-safety CAPABILITIES.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:

PreconditionWhat must be trueHow the agent verifiesWhere to fix
DOCA UROM Service deployed and running on the target BlueFieldThe 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 therePer 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 missingThe public DOCA UROM Service guide; this is not a host-side code fix
Host library and DPU service versions agreepkg-config --modversion doca-urom on the host AND the DPU-side service version are at versions the DOCA Compatibility Policy lists as compatiblepkg-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 matchdoca-setup/SKILL.md for the install-side; route to doca-version/SKILL.md for the four-way-match check
Underlying RDMA transport is healthyUROM 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 anythingPer 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 UROMdoca-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 accessThe 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 groupThe DOCA doca_dev enumeration succeeds for the target device; if it does not, that is an env-side problemdoca-setup/SKILL.md for the env-side; do not modify the program
Plugin for the operation family present at configure timedoca_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_pluginsWalk the plugin-discovery step in ## Capabilities and modes; save the result as the baselineDiagnose 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 collectivesOne 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 wastedDiagnose 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 by doca-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 ## debug redirects 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_caps invocation patterns — owned by doca-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