To execute a primitive, a user needs to pass memory arguments and a stream to
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 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::context objects. Alternatively, oneDNN
itself can create and own the corresponding objects.
An execution engine.
engine() = default#
Constructs an empty engine. An empty engine cannot be used in any operations.
engine(kind akind, size_t index)#
Constructs an engine.
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() = default#
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.
adevice – SYCL device.
acontext – SYCL context.
Engine object for the
adeviceSYCL device, within the specified
cl::sycl::device dnnl::sycl_interop::get_device(const engine &aengine)#
Returns the SYCL device underlying a specified engine object.
aengine – Engine object.
SYCL device object underlying the
A stream is an encapsulation of execution context tied to a particular
engine. They are passed to
dnnl::primitive::execute() when executing a
Streams correspond to and can be constructed from DPC++
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.
An execution 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.
aengine – Engine to create the stream on.
aflags – Flags controlling stream behavior.
stream dnnl::sycl_interop::make_stream(const engine &aengine, cl::sycl::queue &aqueue)#
Creates a stream for a specified engine and SYCL queue objects.
aengine – Engine object to use for the stream.
aqueue – SYCL queue to use for the stream.
Stream object for the
aengineengine object, which holds the
aqueueSYCL queue object.