Struct ocl_extras::command_graph::CommandGraph
source · pub struct CommandGraph { /* private fields */ }
Expand description
A directional sequence dependency graph representing the temporal requirements of each asynchronous read, write, copy, and kernel (commands) for a particular task.
Obviously this is an overkill for this example but this graph is flexible enough to schedule execution correctly and optimally with arbitrarily many parallel tasks with arbitrary duration reads, writes and kernels.
Note that in this example we are using buffer_id
a usize
to represent
memory regions (because that’s what the allocator above is using) but we
could easily use multiple part, complex identifiers/keys. For example, we
may have a program with a large number of buffers which are organized into
a complex hierarchy or some other arbitrary structure. We could swap
buffer_id
for some value which represented that as long as the
identifier we used could uniquely identify each subsection of memory. We
could also use ranges of values and do an overlap check and have
byte-level precision.
Implementations
sourceimpl CommandGraph
impl CommandGraph
sourcepub fn new() -> CommandGraph
pub fn new() -> CommandGraph
Returns a new, empty graph.
sourcepub fn add(&mut self, command: Command) -> Result<usize, ()>
pub fn add(&mut self, command: Command) -> Result<usize, ()>
Adds a new command and returns the command index if successful.
sourcepub fn populate_requisites(&mut self)
pub fn populate_requisites(&mut self)
Populates the list of requisite commands necessary for each command.
Requisite commands (preceding writers and following readers) for a command are those which are causally linked and must come either directly before or after. By determining whether or not a command comes directly before or after another we can determine the causal/temporal relationship between any two nodes on the graph.
Nodes without any preceding writers or following readers are start or finish endpoints respectively. It’s possible for a graph to have no endpoints, in which case the graph is closed and at least partially cyclical.
sourcepub fn get_req_events(
&self,
cmd_idx: usize
) -> Result<Ref<'_, EventList>, &'static str>
pub fn get_req_events(
&self,
cmd_idx: usize
) -> Result<Ref<'_, EventList>, &'static str>
Returns the list of requisite events for a command.
sourcepub fn set_cmd_event(
&self,
cmd_idx: usize,
event: Event
) -> Result<(), &'static str>
pub fn set_cmd_event(
&self,
cmd_idx: usize,
event: Event
) -> Result<(), &'static str>
Sets the event associated with the completion of a command.