ArmNN  NotReleased
TensorHandleStrategyTest.cpp File Reference
#include <boost/test/unit_test.hpp>
#include <armnn/LayerVisitorBase.hpp>
#include <armnn/backends/IBackendContext.hpp>
#include <armnn/backends/IBackendInternal.hpp>
#include <armnn/backends/IMemoryManager.hpp>
#include <armnn/backends/ITensorHandleFactory.hpp>
#include <backendsCommon/TensorHandleFactoryRegistry.hpp>
#include <optimizations/Optimization.hpp>
#include <Network.hpp>
#include <vector>
#include <string>
#include <boost/core/ignore_unused.hpp>

Go to the source code of this file.

Functions

 BOOST_AUTO_TEST_CASE (RegisterFactories)
 
 BOOST_AUTO_TEST_CASE (TensorHandleSelectionStrategy)
 

Function Documentation

◆ BOOST_AUTO_TEST_CASE() [1/2]

BOOST_AUTO_TEST_CASE ( RegisterFactories  )

Definition at line 273 of file TensorHandleStrategyTest.cpp.

274 {
275  TestBackendA backendA;
276  TestBackendB backendB;
277 
278  BOOST_TEST(backendA.GetHandleFactoryPreferences()[0] == "TestHandleFactoryA1");
279  BOOST_TEST(backendA.GetHandleFactoryPreferences()[1] == "TestHandleFactoryA2");
280  BOOST_TEST(backendA.GetHandleFactoryPreferences()[2] == "TestHandleFactoryB1");
281 
283  backendA.RegisterTensorHandleFactories(registry);
284  backendB.RegisterTensorHandleFactories(registry);
285 
286  BOOST_TEST((registry.GetFactory("Non-existing Backend") == nullptr));
287  BOOST_TEST((registry.GetFactory("TestHandleFactoryA1") != nullptr));
288  BOOST_TEST((registry.GetFactory("TestHandleFactoryA2") != nullptr));
289  BOOST_TEST((registry.GetFactory("TestHandleFactoryB1") != nullptr));
290 }

◆ BOOST_AUTO_TEST_CASE() [2/2]

BOOST_AUTO_TEST_CASE ( TensorHandleSelectionStrategy  )

Definition at line 292 of file TensorHandleStrategyTest.cpp.

References Graph::AddCompatibilityLayers(), Graph::AddLayer(), BOOST_AUTO_TEST_SUITE_END(), OutputSlot::Connect(), armnn::CopyToTarget, armnn::DirectCompatibility, armnn::ExportToTarget, Graph::ForEachLayer(), OutputSlot::GetEdgeStrategyForConnection(), Layer::GetInputSlot(), Layer::GetOutputSlot(), OutputSlot::GetTensorHandleFactoryId(), Layer::GetType(), armnn::MemCopy, armnn::MemImport, armnn::SelectTensorHandleStrategy(), Layer::SetBackendId(), and Graph::TopologicalSort().

293 {
294  auto backendA = std::make_unique<TestBackendA>();
295  auto backendB = std::make_unique<TestBackendB>();
296  auto backendC = std::make_unique<TestBackendC>();
297  auto backendD = std::make_unique<TestBackendD>();
298 
300  backendA->RegisterTensorHandleFactories(registry);
301  backendB->RegisterTensorHandleFactories(registry);
302  backendC->RegisterTensorHandleFactories(registry);
303  backendD->RegisterTensorHandleFactories(registry);
304 
305  BackendsMap backends;
306  backends["BackendA"] = std::move(backendA);
307  backends["BackendB"] = std::move(backendB);
308  backends["BackendC"] = std::move(backendC);
309  backends["BackendD"] = std::move(backendD);
310 
311  armnn::Graph graph;
312 
313  armnn::InputLayer* const inputLayer = graph.AddLayer<armnn::InputLayer>(0, "input");
314  inputLayer->SetBackendId("BackendA");
315 
317  armnn::SoftmaxLayer* const softmaxLayer1 = graph.AddLayer<armnn::SoftmaxLayer>(smDesc, "softmax1");
318  softmaxLayer1->SetBackendId("BackendA");
319 
320  armnn::SoftmaxLayer* const softmaxLayer2 = graph.AddLayer<armnn::SoftmaxLayer>(smDesc, "softmax2");
321  softmaxLayer2->SetBackendId("BackendB");
322 
323  armnn::SoftmaxLayer* const softmaxLayer3 = graph.AddLayer<armnn::SoftmaxLayer>(smDesc, "softmax3");
324  softmaxLayer3->SetBackendId("BackendC");
325 
326  armnn::SoftmaxLayer* const softmaxLayer4 = graph.AddLayer<armnn::SoftmaxLayer>(smDesc, "softmax4");
327  softmaxLayer4->SetBackendId("BackendD");
328 
329  armnn::OutputLayer* const outputLayer = graph.AddLayer<armnn::OutputLayer>(0, "output");
330  outputLayer->SetBackendId("BackendA");
331 
332  inputLayer->GetOutputSlot(0).Connect(softmaxLayer1->GetInputSlot(0));
333  softmaxLayer1->GetOutputSlot(0).Connect(softmaxLayer2->GetInputSlot(0));
334  softmaxLayer2->GetOutputSlot(0).Connect(softmaxLayer3->GetInputSlot(0));
335  softmaxLayer3->GetOutputSlot(0).Connect(softmaxLayer4->GetInputSlot(0));
336  softmaxLayer4->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
337 
338  graph.TopologicalSort();
339 
340  std::vector<std::string> errors;
341  auto result = SelectTensorHandleStrategy(graph, backends, registry, errors);
342 
343  BOOST_TEST(result.m_Error == false);
344  BOOST_TEST(result.m_Warning == false);
345 
346  OutputSlot& inputLayerOut = inputLayer->GetOutputSlot(0);
347  OutputSlot& softmaxLayer1Out = softmaxLayer1->GetOutputSlot(0);
348  OutputSlot& softmaxLayer2Out = softmaxLayer2->GetOutputSlot(0);
349  OutputSlot& softmaxLayer3Out = softmaxLayer3->GetOutputSlot(0);
350  OutputSlot& softmaxLayer4Out = softmaxLayer4->GetOutputSlot(0);
351 
352  // Check that the correct factory was selected
353  BOOST_TEST(inputLayerOut.GetTensorHandleFactoryId() == "TestHandleFactoryA1");
354  BOOST_TEST(softmaxLayer1Out.GetTensorHandleFactoryId() == "TestHandleFactoryB1");
355  BOOST_TEST(softmaxLayer2Out.GetTensorHandleFactoryId() == "TestHandleFactoryB1");
356  BOOST_TEST(softmaxLayer3Out.GetTensorHandleFactoryId() == "TestHandleFactoryC1");
357  BOOST_TEST(softmaxLayer4Out.GetTensorHandleFactoryId() == "TestHandleFactoryD1");
358 
359  // Check that the correct strategy was selected
360  BOOST_TEST((inputLayerOut.GetEdgeStrategyForConnection(0) == EdgeStrategy::DirectCompatibility));
361  BOOST_TEST((softmaxLayer1Out.GetEdgeStrategyForConnection(0) == EdgeStrategy::DirectCompatibility));
362  BOOST_TEST((softmaxLayer2Out.GetEdgeStrategyForConnection(0) == EdgeStrategy::CopyToTarget));
363  BOOST_TEST((softmaxLayer3Out.GetEdgeStrategyForConnection(0) == EdgeStrategy::ExportToTarget));
364  BOOST_TEST((softmaxLayer4Out.GetEdgeStrategyForConnection(0) == EdgeStrategy::DirectCompatibility));
365 
366  graph.AddCompatibilityLayers(backends, registry);
367 
368  // Test for copy layers
369  int copyCount= 0;
370  graph.ForEachLayer([&copyCount](Layer* layer)
371  {
372  if (layer->GetType() == LayerType::MemCopy)
373  {
374  copyCount++;
375  }
376  });
377  BOOST_TEST(copyCount == 1);
378 
379  // Test for import layers
380  int importCount= 0;
381  graph.ForEachLayer([&importCount](Layer *layer)
382  {
383  if (layer->GetType() == LayerType::MemImport)
384  {
385  importCount++;
386  }
387  });
388  BOOST_TEST(importCount == 1);
389 }
A layer user-provided data can be bound to (e.g. inputs, outputs).
Definition: InputLayer.hpp:13
LayerType GetType() const
Definition: Layer.hpp:259
Graph & TopologicalSort()
Sorts layers in topological order and return this.
Definition: Graph.hpp:173
This layer represents a softmax operation.
ITensorHandleFactory::FactoryId GetTensorHandleFactoryId() const
Definition: Layer.cpp:172
LayerT * AddLayer(Args &&... args)
Adds a new layer, of type LayerType, to the graph constructed with the arguments passed.
Definition: Graph.hpp:397
int Connect(InputSlot &destination)
Definition: Layer.cpp:79
EdgeStrategy GetEdgeStrategyForConnection(unsigned int connectionIdx) const
Definition: Layer.cpp:182
OptimizationResult SelectTensorHandleStrategy(Graph &optGraph, BackendsMap &backends, TensorHandleFactoryRegistry &registry, Optional< std::vector< std::string > &> errMessages)
Definition: Network.cpp:741
void AddCompatibilityLayers(std::map< BackendId, std::unique_ptr< class IBackendInternal >> &backends, TensorHandleFactoryRegistry &registry)
Definition: Graph.cpp:263
void SetBackendId(const BackendId &id)
Definition: Layer.hpp:264
std::map< BackendId, std::unique_ptr< class IBackendInternal > > BackendsMap
Definition: Network.hpp:292
void ForEachLayer(Func func) const
Definition: Graph.hpp:39
A layer user-provided data can be bound to (e.g. inputs, outputs).
Definition: OutputLayer.hpp:13
A SoftmaxDescriptor for the SoftmaxLayer.
const OutputSlot & GetOutputSlot(unsigned int index=0) const override
Definition: Layer.hpp:312
const InputSlot & GetInputSlot(unsigned int index) const override
Definition: Layer.hpp:310