• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright © 2021 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include <Graph.hpp>
7 #include <Layer.hpp>
8 
9 #include <armnn/TypesUtils.hpp>
10 #include <armnn/Exceptions.hpp>
11 #include <armnn/Optional.hpp>
12 #include <armnn/backends/IBackendInternal.hpp>
13 #include <armnn/backends/TensorHandle.hpp>
14 #include <armnn/utility/PolymorphicDowncast.hpp>
15 #include <backendsCommon/WorkloadFactoryBase.hpp>
16 
17 #include <doctest/doctest.h>
18 
19 namespace {
20 
GetCloneIdStatic()21 const armnn::BackendId& GetCloneIdStatic()
22 {
23     static const armnn::BackendId s_Id{"Tests"};
24     return s_Id;
25 }
26 
27 template <typename T>
DeleteAsType(const void * const blob)28 void DeleteAsType(const void* const blob)
29 {
30     delete static_cast<const T*>(blob);
31 }
32 
33 class TestWorkloadFactory : public armnn::WorkloadFactoryBase
34 {
35 public:
36 
TestWorkloadFactory(void * ptr)37     TestWorkloadFactory(void* ptr)
38         : m_Ptr(ptr)
39     {}
40 
GetBackendId() const41     const armnn::BackendId& GetBackendId() const override
42     {
43         return GetCloneIdStatic();
44     }
45 
CreatePreCompiled(const armnn::PreCompiledQueueDescriptor & descriptor,const armnn::WorkloadInfo &) const46     std::unique_ptr<armnn::IWorkload> CreatePreCompiled(const armnn::PreCompiledQueueDescriptor& descriptor,
47                                                         const armnn::WorkloadInfo&) const override
48     {
49         CHECK(descriptor.m_PreCompiledObject == m_Ptr);
50         return nullptr;
51     }
52 
53     mutable void* m_Ptr;
54 };
55 
56 TEST_SUITE("CloneTests")
57 {
58 
59 TEST_CASE ("PreCompiledLayerClonePreservesObject")
60 {
61     armnn::Graph graph1;
62     armnn::Graph graph2;
63 
64     armnn::PreCompiledDescriptor descriptor(0u, 0u);
65 
66     armnn::Layer* const preCompiledLayer = graph1.AddLayer<armnn::PreCompiledLayer>(descriptor, "preCompiled");
67     armnn::PreCompiledLayer* layer = armnn::PolymorphicDowncast<armnn::PreCompiledLayer*>(preCompiledLayer);
68     std::unique_ptr<std::string> payload = std::make_unique<std::string>("Hello");
69 
70     armnn::PreCompiledObjectPtr payloadObject(payload.release(), DeleteAsType<std::string>);
71     TestWorkloadFactory factory(payloadObject.get());
72 
73     layer->SetPreCompiledObject(std::move(payloadObject));
74     layer->CreateWorkload(factory);
75 
76     armnn::PreCompiledLayer* clone = layer->Clone(graph2);
77     CHECK(std::strcmp(clone->GetName(), "preCompiled") == 0);
78     clone->CreateWorkload(factory);
79 }
80 
81 TEST_CASE ("PreCompiledLayerCloneNoObject")
82 {
83     armnn::Graph graph1;
84 
85     armnn::Graph graph2;
86 
87     armnn::PreCompiledDescriptor descriptor(0u, 0u);
88 
89     armnn::Layer* const preCompiledLayer = graph1.AddLayer<armnn::PreCompiledLayer>(descriptor, "preCompiled");
90     armnn::PreCompiledLayer* layer = armnn::PolymorphicDowncast<armnn::PreCompiledLayer*>(preCompiledLayer);
91 
92     TestWorkloadFactory factory(nullptr);
93     layer->CreateWorkload(factory);
94 
95     armnn::PreCompiledLayer* clone = layer->Clone(graph2);
96     CHECK(std::strcmp(clone->GetName(), "preCompiled") == 0);
97     clone->CreateWorkload(factory);
98 }
99 
100 }
101 
102 } // end anonymous namespace
103