cuda.core: add GraphBuilder.graph_definition property by Andy-Jost · Pull Request #2026 · NVIDIA/cuda-python · GitHub
Skip to content

cuda.core: add GraphBuilder.graph_definition property#2026

Open
Andy-Jost wants to merge 1 commit into
NVIDIA:mainfrom
Andy-Jost:graph-step-3
Open

cuda.core: add GraphBuilder.graph_definition property#2026
Andy-Jost wants to merge 1 commit into
NVIDIA:mainfrom
Andy-Jost:graph-step-3

Conversation

@Andy-Jost

Copy link
Copy Markdown
Contributor

Summary

Completes step 3 of #1330 by exposing the captured graph as an explicit GraphDefinition view that shares ownership of the same graph the builder is producing. The handle-layer plumbing landed in #2008; this PR wires up the user-facing surface and the state-guard rules.

The new property unlocks two hybrid flows:

  • Inspect or augment a captured graph through the explicit API after end_building(), then re-complete() to pick up the changes.
  • Populate a conditional body (returned by if_then / if_else / while_loop / switch) entirely through the explicit API without ever calling begin_building() on it.

API addition

GraphBuilder.graph_definition: GraphDefinition (read-only property)

Availability rules:

Builder kind Before begin_building While building After end_building
Primary RuntimeError RuntimeError OK
Conditional body OK RuntimeError OK
Forked RuntimeError RuntimeError RuntimeError

The returned GraphDefinition is a view, not an owning wrapper: nodes added through it appear in subsequent complete() and debug_dot_print() calls on the builder.

Test plan

Nine new tests in test_graph_builder.py:

  • Happy path: graph_definition returns a GraphDefinition after end_building() and reflects the captured nodes.
  • Three error paths: forked builder, primary pre-begin_building, any builder mid-capture.
  • Shared validity: the returned GraphDefinition keeps working after the builder is closed.
  • Round-trip: mutate via the explicit API after capture, complete(), and run end-to-end on a stream.
  • Conditional-body hybrid flow: populate the body entirely through the explicit API and run.
  • Conditional-body augmentation flow: capture into the body, then add extra nodes through the explicit view, and run.
  • Conditional-body during-capture rejection.

Local pre-commit clean. Local test run on a 2-GPU machine: all cuda_core/tests/graph pass.

Related

Made with Cursor

@Andy-Jost Andy-Jost added this to the cuda.core v1.0.0 milestone May 5, 2026
@Andy-Jost Andy-Jost added enhancement Any code-related improvements P1 Medium priority - Should do cuda.core Everything related to the cuda.core module labels May 5, 2026
@Andy-Jost Andy-Jost self-assigned this May 5, 2026
@Andy-Jost

Copy link
Copy Markdown
Contributor Author

The builds on #2008. Commits unique to this PR begin at de85b92

@github-actions

github-actions Bot commented May 5, 2026

Copy link
Copy Markdown

@Andy-Jost Andy-Jost requested review from leofang and rwgk May 28, 2026 16:47
Completes step 3 of NVIDIA#1330 by exposing the captured graph as an explicit
`GraphDefinition` view that shares ownership of the underlying `CUgraph`.
The handle-layer plumbing landed in PR NVIDIA#2008; this commit wires up the
user-facing surface and locks in the state-guard rules.

State semantics:

- PRIMARY builder: only valid after `end_building()`. Before
  `begin_building()` no graph exists; during capture the driver is the
  sole writer, so explicit access is unsafe.
- CONDITIONAL_BODY builder: valid both before `begin_building()` (the
  body graph is allocated at conditional-node creation time) and after
  `end_building()`. This enables a hybrid flow where a conditional body
  is populated entirely via the explicit API, with no capture at all.
- FORKED builder: never valid. Forked builders share the primary's
  graph; access through the primary instead.

Tests cover the happy path, both hybrid flows on conditional bodies
(populate-via-explicit-API and capture-then-augment), the three error
states (forked, capturing, primary pre-capture), and the
shared-ownership guarantee (the `GraphDefinition` survives the
builder's `close()`).

Co-authored-by: Cursor <cursoragent@cursor.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cuda.core Everything related to the cuda.core module enhancement Any code-related improvements P1 Medium priority - Should do

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants