Status LoadedNetwork::EnqueueWorkload(const InputTensors& inputTensors,
const OutputTensors& outputTensors)
{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "EnqueueWorkload");
-
const Graph& graph = m_OptimizedNetwork->GetGraph();
// Walk graph to determine the order of execution.
}
// For each input to the network, call EnqueueInput with the data passed by the user.
- m_InputQueue.clear();
- m_InputQueue.reserve(graph.GetNumInputs());
- for (const BindableLayer* inputLayer : graph.GetInputLayers())
{
- const TensorPin& pin = workloadData.GetInputTensorPin(inputLayer->GetBindingId());
- EnqueueInput(*inputLayer, pin.GetTensorHandle(), pin.GetTensorInfo());
+ ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "PrepareInputs");
+ m_InputQueue.clear();
+ m_InputQueue.reserve(graph.GetNumInputs());
+ for (const BindableLayer* inputLayer : graph.GetInputLayers())
+ {
+ const TensorPin& pin = workloadData.GetInputTensorPin(inputLayer->GetBindingId());
+ EnqueueInput(*inputLayer, pin.GetTensorHandle(), pin.GetTensorInfo());
+ }
}
// For each output to the network, call EnqueueOutput with the data passed by the user.
- m_OutputQueue.clear();
- m_OutputQueue.reserve(graph.GetNumOutputs());
- for (const BindableLayer* outputLayer : graph.GetOutputLayers())
{
- const TensorPin& pin = workloadData.GetOutputTensorPin(outputLayer->GetBindingId());
- EnqueueOutput(*outputLayer, pin.GetTensorHandle(), pin.GetTensorInfo());
+ ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "PrepareOutputs");
+ m_OutputQueue.clear();
+ m_OutputQueue.reserve(graph.GetNumOutputs());
+ for (const BindableLayer* outputLayer : graph.GetOutputLayers())
+ {
+ const TensorPin& pin = workloadData.GetOutputTensorPin(outputLayer->GetBindingId());
+ EnqueueOutput(*outputLayer, pin.GetTensorHandle(), pin.GetTensorInfo());
+ }
}
std::unique_ptr<TimelineUtilityMethods> timelineUtils =
}
}
-void LoadedNetwork::AllocateWorkingMemory()
+void LoadedNetwork::AllocateWorkingMemory(std::lock_guard<std::mutex>& lock)
{
+ ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Working Memory Allocation");
+
+ // this unused parameter makes sure we can only call this function with a valid lock
+ IgnoreUnused(lock);
+
if (m_IsWorkingMemAllocated)
{
return;
try
{
std::lock_guard<std::mutex> lockGuard(m_WorkingMemMutex);
- AllocateWorkingMemory();
+ AllocateWorkingMemory(lockGuard);
ProfilingDynamicGuid workloadInferenceID(0);
- for (auto& input : m_InputQueue)
+ auto ExecuteQueue = [&timelineUtils, &workloadInferenceID, &inferenceGuid](WorkloadQueue& queue)
{
- if(timelineUtils)
+ for (auto& workload : queue)
{
- workloadInferenceID = timelineUtils->RecordWorkloadInferenceAndStartOfLifeEvent(input->GetGuid(),
- inferenceGuid);
- }
- input->Execute();
- if(timelineUtils)
- {
- timelineUtils->RecordEndOfLifeEvent(workloadInferenceID);
+ if(timelineUtils)
+ {
+ workloadInferenceID = timelineUtils->RecordWorkloadInferenceAndStartOfLifeEvent(workload->GetGuid(),
+ inferenceGuid);
+ }
+ workload->Execute();
+ if(timelineUtils)
+ {
+ timelineUtils->RecordEndOfLifeEvent(workloadInferenceID);
+ }
}
- }
+ };
- for (auto& workload : m_WorkloadQueue)
- {
- if(timelineUtils)
- {
- workloadInferenceID = timelineUtils->RecordWorkloadInferenceAndStartOfLifeEvent(workload->GetGuid(),
- inferenceGuid);
- }
- workload->Execute();
- if(timelineUtils)
- {
- timelineUtils->RecordEndOfLifeEvent(workloadInferenceID);
- }
- }
- for (auto& output: m_OutputQueue)
- {
- if(timelineUtils)
- {
- workloadInferenceID = timelineUtils->RecordWorkloadInferenceAndStartOfLifeEvent(output->GetGuid(),
- inferenceGuid);
- }
- output->Execute();
- if(timelineUtils)
- {
- timelineUtils->RecordEndOfLifeEvent(workloadInferenceID);
- }
- }
+ ExecuteQueue(m_InputQueue);
+ ExecuteQueue(m_WorkloadQueue);
+ ExecuteQueue(m_OutputQueue);
}
catch (const RuntimeException& error)
{
using InstrumentPtr = std::unique_ptr<Instrument>;
template<typename... Args>
- ScopedProfilingEvent(const BackendId& backendId, const std::string& name, Args... args)
+ ScopedProfilingEvent(const BackendId& backendId, const std::string& name, Args&&... args)
: m_Event(nullptr)
, m_Profiler(ProfilerManager::GetInstance().GetProfiler())
{
{
std::vector<InstrumentPtr> instruments(0);
instruments.reserve(sizeof...(args)); //One allocation
- ConstructNextInVector(instruments, args...);
+ ConstructNextInVector(instruments, std::forward<Args>(args)...);
m_Event = m_Profiler->BeginEvent(backendId, name, std::move(instruments));
}
}
}
template<typename Arg, typename... Args>
- void ConstructNextInVector(std::vector<InstrumentPtr>& instruments, Arg arg, Args... args)
+ void ConstructNextInVector(std::vector<InstrumentPtr>& instruments, Arg&& arg, Args&&... args)
{
- instruments.emplace_back(std::make_unique<Arg>(arg));
- ConstructNextInVector(instruments, args...);
+ instruments.emplace_back(std::make_unique<Arg>(std::forward<Arg>(arg)));
+ ConstructNextInVector(instruments, std::forward<Args>(args)...);
}
Event* m_Event; ///< Event to track