5 #include <boost/test/unit_test.hpp> 25 using namespace armnn;
30 TestMemMgr() =
default;
32 void Acquire()
override {}
33 void Release()
override {}
44 std::unique_ptr<ITensorHandle> CreateSubTensorHandle(
ITensorHandle& parent,
46 unsigned int const* subTensorOrigin)
const override 52 std::unique_ptr<ITensorHandle> CreateTensorHandle(
const TensorInfo& tensorInfo)
const override 58 std::unique_ptr<ITensorHandle> CreateTensorHandle(
const TensorInfo& tensorInfo,
65 const FactoryId& GetId()
const override {
return m_Id; }
67 bool SupportsSubTensors()
const override {
return true; }
74 std::weak_ptr<IMemoryManager> m_MemMgr;
85 std::unique_ptr<ITensorHandle> CreateSubTensorHandle(
ITensorHandle& parent,
87 unsigned int const* subTensorOrigin)
const override 93 std::unique_ptr<ITensorHandle> CreateTensorHandle(
const TensorInfo& tensorInfo)
const override 99 std::unique_ptr<ITensorHandle> CreateTensorHandle(
const TensorInfo& tensorInfo,
106 const FactoryId& GetId()
const override {
return m_Id; }
108 bool SupportsSubTensors()
const override {
return true; }
115 std::weak_ptr<IMemoryManager> m_MemMgr;
121 TestBackendA() =
default;
123 const BackendId& GetId()
const override {
return m_Id; }
125 IWorkloadFactoryPtr CreateWorkloadFactory(
const IMemoryManagerSharedPtr& memoryManager =
nullptr)
const override 128 return IWorkloadFactoryPtr{};
136 std::vector<ITensorHandleFactory::FactoryId> GetHandleFactoryPreferences()
const override 138 return std::vector<ITensorHandleFactory::FactoryId>
140 "TestHandleFactoryA1",
141 "TestHandleFactoryA2",
142 "TestHandleFactoryB1",
143 "TestHandleFactoryD1" 149 auto mgr = std::make_shared<TestMemMgr>();
152 registry.
RegisterFactory(std::make_unique<TestFactory1>(mgr,
"TestHandleFactoryA1"));
153 registry.
RegisterFactory(std::make_unique<TestFactory1>(mgr,
"TestHandleFactoryA2"));
163 TestBackendB() =
default;
165 const BackendId& GetId()
const override {
return m_Id; }
167 IWorkloadFactoryPtr CreateWorkloadFactory(
const IMemoryManagerSharedPtr& memoryManager =
nullptr)
const override 170 return IWorkloadFactoryPtr{};
178 std::vector<ITensorHandleFactory::FactoryId> GetHandleFactoryPreferences()
const override 180 return std::vector<ITensorHandleFactory::FactoryId>
182 "TestHandleFactoryB1" 188 auto mgr = std::make_shared<TestMemMgr>();
191 registry.
RegisterFactory(std::make_unique<TestFactory1>(mgr,
"TestHandleFactoryB1"));
201 TestBackendC() =
default;
203 const BackendId& GetId()
const override {
return m_Id; }
205 IWorkloadFactoryPtr CreateWorkloadFactory(
const IMemoryManagerSharedPtr& memoryManager =
nullptr)
const override 208 return IWorkloadFactoryPtr{};
216 std::vector<ITensorHandleFactory::FactoryId> GetHandleFactoryPreferences()
const override 218 return std::vector<ITensorHandleFactory::FactoryId>{
219 "TestHandleFactoryC1" 225 auto mgr = std::make_shared<TestMemMgr>();
228 registry.
RegisterFactory(std::make_unique<TestFactory1>(mgr,
"TestHandleFactoryC1"));
238 TestBackendD() =
default;
240 const BackendId& GetId()
const override {
return m_Id; }
242 IWorkloadFactoryPtr CreateWorkloadFactory(
const IMemoryManagerSharedPtr& memoryManager =
nullptr)
const override 245 return IWorkloadFactoryPtr{};
253 std::vector<ITensorHandleFactory::FactoryId> GetHandleFactoryPreferences()
const override 255 return std::vector<ITensorHandleFactory::FactoryId>{
256 "TestHandleFactoryD1",
262 auto mgr = std::make_shared<TestMemMgr>();
265 registry.
RegisterFactory(std::make_unique<TestFactoryImport>(mgr,
"TestHandleFactoryD1"));
277 TestBackendA backendA;
278 TestBackendB backendB;
280 BOOST_TEST(backendA.GetHandleFactoryPreferences()[0] ==
"TestHandleFactoryA1");
281 BOOST_TEST(backendA.GetHandleFactoryPreferences()[1] ==
"TestHandleFactoryA2");
282 BOOST_TEST(backendA.GetHandleFactoryPreferences()[2] ==
"TestHandleFactoryB1");
283 BOOST_TEST(backendA.GetHandleFactoryPreferences()[3] ==
"TestHandleFactoryD1");
286 backendA.RegisterTensorHandleFactories(registry);
287 backendB.RegisterTensorHandleFactories(registry);
289 BOOST_TEST((registry.GetFactory(
"Non-existing Backend") ==
nullptr));
290 BOOST_TEST((registry.GetFactory(
"TestHandleFactoryA1") !=
nullptr));
291 BOOST_TEST((registry.GetFactory(
"TestHandleFactoryA2") !=
nullptr));
292 BOOST_TEST((registry.GetFactory(
"TestHandleFactoryB1") !=
nullptr));
297 auto backendA = std::make_unique<TestBackendA>();
298 auto backendB = std::make_unique<TestBackendB>();
299 auto backendC = std::make_unique<TestBackendC>();
300 auto backendD = std::make_unique<TestBackendD>();
303 backendA->RegisterTensorHandleFactories(registry);
304 backendB->RegisterTensorHandleFactories(registry);
305 backendC->RegisterTensorHandleFactories(registry);
306 backendD->RegisterTensorHandleFactories(registry);
309 backends[
"BackendA"] = std::move(backendA);
310 backends[
"BackendB"] = std::move(backendB);
311 backends[
"BackendC"] = std::move(backendC);
312 backends[
"BackendD"] = std::move(backendD);
343 std::vector<std::string> errors;
346 BOOST_TEST(result.m_Error ==
false);
347 BOOST_TEST(result.m_Warning ==
false);
380 BOOST_TEST(copyCount == 1);
391 BOOST_TEST(importCount == 1);
BOOST_AUTO_TEST_SUITE(TensorflowLiteParser)
void RegisterMemoryManager(std::shared_ptr< IMemoryManager > memoryManger)
Register a memory manager with shared ownership.
No strategy has been defined. Used internally to verify integrity of optimizations.
LayerT * AddLayer(Args &&... args)
Adds a new layer, of type LayerType, to the graph constructed with the arguments passed.
void RegisterFactory(std::unique_ptr< ITensorHandleFactory > allocator)
Register a TensorHandleFactory and transfer ownership.
Source backends tensor data can be exported to destination backend tensor without copy...
std::shared_ptr< ILayerSupport > ILayerSupportSharedPtr
int Connect(InputSlot &destination)
EdgeStrategy GetEdgeStrategyForConnection(unsigned int connectionIdx) const
unsigned int MemorySourceFlags
Copyright (c) 2021 ARM Limited and Contributors.
void IgnoreUnused(Ts &&...)
void SetBackendId(const BackendId &id)
Destination backend can work directly with tensors on source backend.
const InputSlot & GetInputSlot(unsigned int index) const override
Get a const input slot handle by slot index.
A layer user-provided data can be bound to (e.g. inputs, outputs).
void ForEachLayer(Func func) const
ITensorHandleFactory::FactoryId FactoryId
This layer represents a softmax operation.
LayerType GetType() const override
Returns the armnn::LayerType of this layer.
BOOST_AUTO_TEST_CASE(CheckConvolution2dLayer)
std::shared_ptr< ILayerSupport > ILayerSupportSharedPtr
BOOST_AUTO_TEST_SUITE_END()
const OutputSlot & GetOutputSlot(unsigned int index=0) const override
Get the const output slot handle by slot index.
OptimizationResult SelectTensorHandleStrategy(Graph &optGraph, BackendsMap &backends, TensorHandleFactoryRegistry ®istry, bool importEnabled, Optional< std::vector< std::string > &> errMessages)
ITensorHandleFactory::FactoryId GetTensorHandleFactoryId() const
Graph & TopologicalSort()
Sorts layers in topological order and return this.
A SoftmaxDescriptor for the SoftmaxLayer.
void AddCompatibilityLayers(std::map< BackendId, std::unique_ptr< class IBackendInternal >> &backends, TensorHandleFactoryRegistry ®istry)
Modifies the graph in-place, removing edges connecting layers using different compute devices...
std::map< BackendId, std::unique_ptr< class IBackendInternal > > BackendsMap