Skip to content

Fix HRX HIP graph lifecycle query semantics#69

Open
AWoloszyn wants to merge 1 commit into
mainfrom
users/awoloszyn/fix-graph-lifecycle-queries
Open

Fix HRX HIP graph lifecycle query semantics#69
AWoloszyn wants to merge 1 commit into
mainfrom
users/awoloszyn/fix-graph-lifecycle-queries

Conversation

@AWoloszyn

Copy link
Copy Markdown
Collaborator

HRX treated several HIP graph lifecycle APIs as shallow stubs: hipGraphNodeGetType always reported an empty node, hipGraphDestroyNode was a no-op, dependency insertion trusted caller-owned node handles, and hipGraphGetNodes always returned the total graph size even when the caller supplied a smaller output buffer. Those APIs expose graph-template structure directly, so the runtime needs to preserve node membership, liveness, dependency identity, and query counts consistently while the graph is being edited.

Track the owning graph on each template node while it is active, validate added dependency edges before mutating the graph, reject null/self/duplicate/cross-graph dependencies, and keep separately-added edges visible to duplicate detection. Implement node destruction by removing the node from graph/root node lists, dropping dependency references and extra edges that mention it, clearing its owning graph, and renumbering the remaining active nodes so query order stays dense.

Also map HRX internal node kinds back to HIP graph node types and make hipGraphGetNodes follow native small-buffer behavior: copy only the requested number of nodes, report the copied count, and clear the unused tail when the caller asks for more entries than exist. This makes graph lifecycle/query behavior deterministic and prevents destroyed or foreign nodes from remaining observable through later graph queries.

HRX treated several HIP graph lifecycle APIs as shallow stubs: hipGraphNodeGetType always reported an empty node, hipGraphDestroyNode was a no-op, dependency insertion trusted caller-owned node handles, and hipGraphGetNodes always returned the total graph size even when the caller supplied a smaller output buffer. Those APIs expose graph-template structure directly, so the runtime needs to preserve node membership, liveness, dependency identity, and query counts consistently while the graph is being edited.

Track the owning graph on each template node while it is active, validate added dependency edges before mutating the graph, reject null/self/duplicate/cross-graph dependencies, and keep separately-added edges visible to duplicate detection. Implement node destruction by removing the node from graph/root node lists, dropping dependency references and extra edges that mention it, clearing its owning graph, and renumbering the remaining active nodes so query order stays dense.

Also map HRX internal node kinds back to HIP graph node types and make hipGraphGetNodes follow native small-buffer behavior: copy only the requested number of nodes, report the copied count, and clear the unused tail when the caller asks for more entries than exist. This makes graph lifecycle/query behavior deterministic and prevents destroyed or foreign nodes from remaining observable through later graph queries.
@AWoloszyn AWoloszyn requested a review from zjgarvey June 10, 2026 15:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant