StreamCallback
#include <poplar/StreamCallback.hpp>
-
namespace poplar
Poplar classes and functions.
-
class LegacyStreamCallback : public poplar::StreamCallback
- #include <StreamCallback.hpp>
Convenience StreamCallback specialization for implementations that do not support prefetch/complete operations when the data type used does not require metadata.
-
class ResumableStreamCallback : public poplar::StreamCallback
- #include <StreamCallback.hpp>
Expands StreamCallback API with functions that prevent further progress.
Useful when there are dependencies or conditions between callbacks that prevent progress within the callback function.
Public Functions
-
ResumableStreamCallback()
-
~ResumableStreamCallback()
-
void notify()
Schedules the callback task back to execution.
Continues execution from the last point where wait() was called.
-
bool isAwaiting() const
Returns whether the callback task is waiting to be notified.
Protected Functions
-
void wait()
Calling this function will suspend the execution of the current callback.
Should only be called from
this
.
Private Members
-
SSOPointer<ConditionVar> conditionVar
-
ResumableStreamCallback()
-
class StreamCallback : public poplar::StreamCallbackBase
- #include <StreamCallback.hpp>
Interface used during stream copies to produce/consume the data being exchanged between the host and the device.
The type of the data must not require metadata.
In regular stream copies, fetch() and complete() are called as a result of the device requesting the data transfer. In host-to-device streams, prefetch() may be called after the completion of the last transfer of the same stream.
Subclassed by poplar::LegacyStreamCallback, poplar::ResumableStreamCallback, poplar::StreamCallbackWithMetadata
Public Functions
-
virtual ~StreamCallback() = default
-
virtual Result prefetch(void *p) = 0
Callback function to fill the host buffer (host-to-device streams only).
This function is called speculatively, this means it might still be called even if no additional copies for this stream exist for the remaining execution of the program.
The following situations are possible during the invocation:
There is more data available for consumption (A)
Data is temporarily not available during the time this function is called (B)
The stream reached the end and so no more data is available (C)
The return value indicates if the invocation resulted in the buffer being successfully filled. In the first case (A), the function shall return
Result::Success
. A call to complete() will follow if the program ends up transferring the data. Otherwise (scenarios B and C), it must returnResult::NotAvailable
. Calls to fetch() and then complete() will follow if the transfer takes place.Note that when using a buffered data stream (see Graph::addHostToDeviceFIFO(),
bufferingDepth
option) there can be multiple calls to prefetch() before a corresponding complete() is called. In some circumstances prefetched data is invalidated and not read, and therefore will have no corresponding complete(), this is notified with invalidatePrefetched().- Parameters
p – Location of the buffer. It will only be valid for the duration of the function.
- Returns
Result::Success
if the function was able to fill the buffer with data, orResult::NotAvailable
otherwise.
-
virtual void fetch(void*) = 0
Callback function to fill the host buffer.
This function is called as a result of a stream copy, unless the last prefetch() invocation was successful.
It must always fill the buffer with more data and it is followed by a call to complete().
-
virtual ~StreamCallback() = default
-
class StreamCallbackBase
Subclassed by poplar::StreamCallback
Public Functions
-
virtual ~StreamCallbackBase() = default
-
inline virtual void complete()
Notifies that the data involved in the last prefetch/fetch invocation is used by the device.
It usually means that a speculative read was a hit, and the callback can move on to the next piece of input.
-
inline virtual void invalidatePrefetched()
Notifies when the engine will reset this stream (invalidating any prefetched data which has not been read).
-
virtual ~StreamCallbackBase() = default
-
class StreamCallbackHandle
- #include <StreamCallback.hpp>
Wrapper for StreamCallback instances.
Provides backwards compatibility with C++ lambda expressions and
std::function
instances.Public Functions
-
template<class CallbackImpl, typename = typename std::enable_if<std::is_base_of<StreamCallback, CallbackImpl>::value || std::is_base_of<StreamCallbackWithMetadata, CallbackImpl>::value>::type>
inline StreamCallbackHandle(std::unique_ptr<CallbackImpl> f) Constructs a handle from an instance of a stream callback implementation.
This constructor only participates in overload resolution if CallbackImpl is derived from either poplar::StreamCallback or poplar::StreamCallbackWithMetadata (in other words, it is an implementation of the callback interface).
-
template<class F, typename = typename std::enable_if<traits::is_callback<F>::value>::type>
inline StreamCallbackHandle(F &&f) Constructs a handle from a callable instance.
This constructor only participates in overload resolution if
F
satisfies the requirements of a Function Object. It transformsf
into a LegacyStreamCallback implementation.
-
StreamCallbackHandle(const StreamCallbackHandle&) = delete
-
StreamCallbackHandle(StreamCallbackHandle&&) = default
-
inline operator std::unique_ptr<StreamCallbackBase>() &&
Extracts the callback implementation from the handle.
-
operator std::unique_ptr<StreamCallback>() &&
Extract callback implementation after casting to StreamCallback.
This function will return the callback only if the pointer matches StreamCallback and does not match StreamCallbackWithMetadata. Otherwise nullptr is returned.
-
operator std::unique_ptr<StreamCallbackWithMetadata>() &&
Extract callback implementation after casting to StreamCallbackWithMetadata.
This function will return the callback only if the pointer matches StreamCallbackWithMetadata. Otherwise nullptr is returned.
Private Members
-
std::unique_ptr<StreamCallbackBase> callback
Private Static Functions
-
template<class F>
static inline std::unique_ptr<StreamCallback> makeCallback(F &&f)
-
template<class CallbackImpl, typename = typename std::enable_if<std::is_base_of<StreamCallback, CallbackImpl>::value || std::is_base_of<StreamCallbackWithMetadata, CallbackImpl>::value>::type>
-
class StreamCallbackWithMetadata : public poplar::StreamCallback
- #include <StreamCallback.hpp>
Interface used to add support for stream copies to produce/consume data if the data type requires metadata.
Public Functions
-
virtual ~StreamCallbackWithMetadata() = default
-
inline QuarterMetadata getMetadata() const
Get the binary representation of metadata on the host.
- Returns
Metadata value.
-
inline void setMetadata(QuarterMetadata md)
Set the binary representation of metadata on the host.
- Parameters
md – Metadata value.
Private Members
-
QuarterMetadata metadata
-
virtual ~StreamCallbackWithMetadata() = default
-
class LegacyStreamCallback : public poplar::StreamCallback