Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[SYCL][Graph] Add implicit queue recording mechanism #377

Closed
wants to merge 3 commits into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 33 additions & 1 deletion sycl/doc/extensions/experimental/sycl_ext_oneapi_graph.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -1442,7 +1442,7 @@ The alternative `queue_state::recording` state is used for graph construction.
Instead of being scheduled for execution, command-groups submitted to the queue
are recorded to a graph object as new nodes for each submission. After recording
has finished and the queue returns to the executing state, the recorded commands are
not then executed, they are transparent to any following queue operations. The state
not executed, they are transparent to any following queue operations. The state
of a queue can be queried with `queue::ext_oneapi_get_state()`.

.Queue State Diagram
Expand All @@ -1453,6 +1453,38 @@ graph LR
Recording -->|End Recording| Executing
....

==== Transitive Queue Recording

Submitting a command-group to a queue in the executable state can implicitly
change its state to `queue_state::recording`. This will occur when the
command-group depends on an event that has been returned by a queue in the
recording state. The change of state happens before the command-group is
submitted (i.e. a new graph node will be created for that command-group).

A queue whose state has been set to `queue_state::recording` using this
mechanism, will behave as if it had been passed as an argument to
`command_graph::begin_recording()`. In particular, its state will not
change again until `command_graph::end_recording()` is called.

EwanC marked this conversation as resolved.
Show resolved Hide resolved
===== Example

[source,c++]
----
// q1 state is set to recording.
graph.begin_recording(q1);

// Node is added to the graph by submitting to a recording queue.
auto e1 = q1.single_task(...);

// Since there is a dependency on e1 which was created by a queue being
// recorded, q2 immediately enters record mode, and a new node is created
// with an edge between e1 and e2.
auto e2 = q2.single_task(e1, ...);

// Ends recording on q1 and q2.
graph.end_recording();
----

==== Queue Properties

:queue-properties: https://registry.khronos.org/SYCL/specs/sycl-2020/html/sycl-2020.html#sec:queue-properties
Expand Down