// // Copyright © 2021 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // #pragma once #include #include #include #include "LayerFwd.hpp" #include "Network.hpp" #include "Profiling.hpp" #include "WorkingMemHandle.hpp" #include #include #include #include #include #include #include namespace armnn { namespace experimental { class AsyncNetworkImpl final { public: using WorkloadQueue = std::vector>; AsyncNetworkImpl(std::unique_ptr net, const INetworkProperties &networkProperties, profiling::ProfilingService &profilingService); ~AsyncNetworkImpl() { FreeWorkingMemory(); } TensorInfo GetInputTensorInfo(LayerBindingId layerId) const; TensorInfo GetOutputTensorInfo(LayerBindingId layerId) const; /// Thread safe execution of the network. Returns once execution is complete. /// Will block until this and any other thread using the same workingMem object completes. virtual Status Execute(const InputTensors& inputTensors, const OutputTensors& outputTensors, IWorkingMemHandle& workingMemHandle); /// Create a new unique WorkingMemHandle object. Create multiple handles if you wish to have /// overlapped Execution by calling this function from different threads. std::unique_ptr CreateWorkingMemHandle(); /// Get the profiler used for this network std::shared_ptr GetProfiler() const; /// Register a debug callback function to be used with this network void RegisterDebugCallback(const DebugCallbackFunction& func); private: void FreeWorkingMemory(); void CollectInputTensorHandles(std::unordered_map >& tensorHandles, std::vector& inputs, const armnn::Layer* layer, const TensorHandleFactoryRegistry& registry, const bool isMemoryManaged = false); void CreateOutputTensorHandles(std::unordered_map >& tensorHandles, std::vector& outputs, const armnn::Layer* layer, const TensorHandleFactoryRegistry& registry, const bool isMemoryManaged = false); void EnqueueInput(const BindableLayer& layer, const ConstTensor& inputTensor, WorkingMemHandle& handle); void EnqueueOutput(const BindableLayer& layer, const Tensor& outputTensor, WorkingMemHandle& handle); using BackendPtrMap = std::unordered_map; using WorkloadFactoryWithMemoryManager = std::pair; using WorkloadFactoryMap = std::unordered_map; const IWorkloadFactory& GetWorkloadFactory(const Layer& layer) const; BackendPtrMap m_Backends; WorkloadFactoryMap m_WorkloadFactories; std::unique_ptr m_OptimizedNetwork; INetworkProperties m_NetworkProperties; WorkloadQueue m_WorkloadQueue; std::shared_ptr m_Profiler; TensorHandleFactoryRegistry m_TensorHandleFactoryRegistry; /// Profiling Service Instance profiling::ProfilingService& m_ProfilingService; }; } // end experimental namespace } // end armnn namespace