Task execution¶
This section provides a deeper look into the technical background concerning
scheduling and task execution. The execution model of the UFO framework is based
on the Ufo.TaskGraph
that represents a network of interconnected task
nodes and the Ufo.BaseScheduler
that runs these tasks according to a
pre-defined strategy. The Ufo.Scheduler
is a concrete implementation and is
the default choice because it is able to instantiate tasks in a multi-GPU
environment. For greater flexibility, the Ufo.FixedScheduler
can be used to
define arbitrary GPU mappings.
Profiling execution¶
By default, the scheduler measures the run-time from initial setup until
processing of the last data item finished. You can get the time in seconds via the
time
property
g = Ufo.TaskGraph()
scheduler = Ufo.Scheduler()
scheduler.run(g)
print("Time spent: {}s".format(scheduler.time))
To get more fine-grained insight into the execution, you can enable tracing
scheduler.props.enable_tracing = True
scheduler.run(g)
and analyse the generated traces for OpenCL (saved in opencl.PID.json
) and
general events (saved in trace.PID.json
). To visualize the trace events, you
can either use the distributed ufo-prof
tool or Google Chrome or Chromium by
going to chrome://tracing and loading the JSON files.
Broadcasting results¶
Connecting a task output to multiple consumers will in most cases cause
undefined results because some data is processed differently than others. A
certain class of problems can be solved by inserting explicit Ufo.CopyTask
nodes and executing the graph with a Ufo.FixedScheduler
. In the following
example, we want write the same data twice with a different prefix:
from gi.repository import Ufo
pm = Ufo.PluginManager()
sched = Ufo.FixedScheduler()
graph = Ufo.TaskGraph()
copy = Ufo.CopyTask()
data = pm.get_task('read')
write1 = pm.get_task('write')
write1.set_properties(filename='w1-%05i.tif')
write2 = pm.get_task('write')
write2.set_properties(filename='w2-%05i.tif')
graph.connect_nodes(data, copy)
graph.connect_nodes(copy, write1)
graph.connect_nodes(copy, write2)
sched.run(graph)
Note
The copy task node is not a regular plugin but part of the core API and
thus cannot be used with tools like ufo-runjson
or ufo-launch
.