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" 148 auto mgr = std::make_shared<TestMemMgr>();
151 registry.
RegisterFactory(std::make_unique<TestFactory1>(mgr,
"TestHandleFactoryA1"));
152 registry.
RegisterFactory(std::make_unique<TestFactory1>(mgr,
"TestHandleFactoryA2"));
162 TestBackendB() =
default;
164 const BackendId& GetId()
const override {
return m_Id; }
166 IWorkloadFactoryPtr CreateWorkloadFactory(
const IMemoryManagerSharedPtr& memoryManager =
nullptr)
const override 169 return IWorkloadFactoryPtr{};
177 std::vector<ITensorHandleFactory::FactoryId> GetHandleFactoryPreferences()
const override 179 return std::vector<ITensorHandleFactory::FactoryId>
181 "TestHandleFactoryB1" 187 auto mgr = std::make_shared<TestMemMgr>();
190 registry.
RegisterFactory(std::make_unique<TestFactory1>(mgr,
"TestHandleFactoryB1"));
200 TestBackendC() =
default;
202 const BackendId& GetId()
const override {
return m_Id; }
204 IWorkloadFactoryPtr CreateWorkloadFactory(
const IMemoryManagerSharedPtr& memoryManager =
nullptr)
const override 207 return IWorkloadFactoryPtr{};
215 std::vector<ITensorHandleFactory::FactoryId> GetHandleFactoryPreferences()
const override 217 return std::vector<ITensorHandleFactory::FactoryId>{
218 "TestHandleFactoryC1" 224 auto mgr = std::make_shared<TestMemMgr>();
227 registry.
RegisterFactory(std::make_unique<TestFactory1>(mgr,
"TestHandleFactoryC1"));
237 TestBackendD() =
default;
239 const BackendId& GetId()
const override {
return m_Id; }
241 IWorkloadFactoryPtr CreateWorkloadFactory(
const IMemoryManagerSharedPtr& memoryManager =
nullptr)
const override 244 return IWorkloadFactoryPtr{};
252 std::vector<ITensorHandleFactory::FactoryId> GetHandleFactoryPreferences()
const override 254 return std::vector<ITensorHandleFactory::FactoryId>{
255 "TestHandleFactoryD1" 261 auto mgr = std::make_shared<TestMemMgr>();
264 registry.
RegisterFactory(std::make_unique<TestFactoryImport>(mgr,
"TestHandleFactoryD1"));
276 TestBackendA backendA;
277 TestBackendB backendB;
279 BOOST_TEST(backendA.GetHandleFactoryPreferences()[0] ==
"TestHandleFactoryA1");
280 BOOST_TEST(backendA.GetHandleFactoryPreferences()[1] ==
"TestHandleFactoryA2");
281 BOOST_TEST(backendA.GetHandleFactoryPreferences()[2] ==
"TestHandleFactoryB1");
284 backendA.RegisterTensorHandleFactories(registry);
285 backendB.RegisterTensorHandleFactories(registry);
287 BOOST_TEST((registry.GetFactory(
"Non-existing Backend") ==
nullptr));
288 BOOST_TEST((registry.GetFactory(
"TestHandleFactoryA1") !=
nullptr));
289 BOOST_TEST((registry.GetFactory(
"TestHandleFactoryA2") !=
nullptr));
290 BOOST_TEST((registry.GetFactory(
"TestHandleFactoryB1") !=
nullptr));
295 auto backendA = std::make_unique<TestBackendA>();
296 auto backendB = std::make_unique<TestBackendB>();
297 auto backendC = std::make_unique<TestBackendC>();
298 auto backendD = std::make_unique<TestBackendD>();
301 backendA->RegisterTensorHandleFactories(registry);
302 backendB->RegisterTensorHandleFactories(registry);
303 backendC->RegisterTensorHandleFactories(registry);
304 backendD->RegisterTensorHandleFactories(registry);
307 backends[
"BackendA"] = std::move(backendA);
308 backends[
"BackendB"] = std::move(backendB);
309 backends[
"BackendC"] = std::move(backendC);
310 backends[
"BackendD"] = std::move(backendD);
341 std::vector<std::string> errors;
344 BOOST_TEST(result.m_Error ==
false);
345 BOOST_TEST(result.m_Warning ==
false);
378 BOOST_TEST(copyCount == 1);
389 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) 2020 ARM Limited.
void IgnoreUnused(Ts &&...)
void SetBackendId(const BackendId &id)
OptimizationResult SelectTensorHandleStrategy(Graph &optGraph, BackendsMap &backends, TensorHandleFactoryRegistry ®istry, Optional< std::vector< std::string > &> errMessages)
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.
BOOST_AUTO_TEST_CASE(CheckConvolution2dLayer)
std::shared_ptr< ILayerSupport > ILayerSupportSharedPtr
BOOST_AUTO_TEST_SUITE_END()
LayerType GetType() const
const OutputSlot & GetOutputSlot(unsigned int index=0) const override
Get the const output slot handle by slot index.
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