Execution Model
Contents
Execution Model#
To execute a primitive, a user needs to pass memory arguments and a stream to
the dnnl::primitive::execute()
member function.
The primitive’s computations are executed on the computational device corresponding to the engine on which the primitive (and memory arguments) were created and happens within the context of the stream.
Engine#
Engine is abstraction of a computational device: a CPU, a specific GPU card in the system, etc. Most primitives are created to execute computations on one specific engine. The only exceptions are reorder primitives that transfer data between two different engines.
Engines correspond to and can be constructed from pairs of the DPC++
sycl::device
and sycl::context
objects. Alternatively, oneDNN
itself can create and own the corresponding objects.
-
struct engine#
An execution engine.
Public Types
Public Functions
-
engine()#
Constructs an empty engine. An empty engine cannot be used in any operations.
-
engine(kind akind, size_t index)#
Constructs an engine.
- Parameters
akind – The kind of engine to construct.
index – The index of the engine. Must be less than the value returned by get_count() for this particular kind of engine.
-
engine()#
-
engine dnnl::sycl_interop::make_engine(const cl::sycl::device &adevice, const cl::sycl::context &acontext)#
Creates an engine object using a specified SYCL device and SYCL context objects.
- Parameters
adevice – SYCL device.
acontext – SYCL context.
- Returns
Engine object for the
adevice
SYCL device, within the specifiedacontext
SYCL context.
Stream#
A stream is an encapsulation of execution context tied to a particular
engine. They are passed to dnnl::primitive::execute()
when executing a
primitive.
Streams correspond to and can be constructed from DPC++ sycl::queue
objects. Alternatively, oneDNN itself can create and own the corresponding
objects. Streams are considered to be ephemeral and can be created / destroyed
as long these operation do not violate DPC++ synchronization requirements.
Similar to DPC++ queues, streams can be in-order and out-of-order (see the
relevant portion of the DPC++ specification for the explanation). The desired
behavior can be specified using dnnl::stream::flags
value. A stream
created from a DPC++ queue inherits its behavior.
-
struct stream#
An execution stream.
Public Types
Public Functions
-
stream()#
Constructs an empty stream. An empty stream cannot be used in any operations.
-
stream(const engine &aengine, flags aflags = flags::default_flags)#
Constructs a stream for the specified engine and with behavior controlled by the specified flags.
- Parameters
aengine – Engine to create the stream on.
aflags – Flags controlling stream behavior.
-
stream()#
-
stream dnnl::sycl_interop::make_stream(const engine &aengine, cl::sycl::queue &aqueue)#
Creates a stream for a specified engine and SYCL queue objects.
- Parameters
aengine – Engine object to use for the stream.
aqueue – SYCL queue to use for the stream.
- Returns
Stream object for the
aengine
engine object, which holds theaqueue
SYCL queue object.