1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 #pragma once
6
7 #include <memory>
8 #include <ostream>
9 #include <set>
10 #include <string>
11 #include <unordered_set>
12 #include <vector>
13
14 namespace armnn
15 {
16
17 ///
18 /// The Compute enum is now deprecated and it is now
19 /// being replaced by BackendId
20 ///
21 enum class Compute
22 {
23 Undefined = 0,
24 /// CPU Execution: Reference C++ kernels
25 CpuRef = 1,
26 /// CPU Execution: NEON: ArmCompute
27 CpuAcc = 2,
28 /// GPU Execution: OpenCL: ArmCompute
29 GpuAcc = 3
30 };
31
32 /// Deprecated function that will be removed together with
33 /// the Compute enum
GetComputeDeviceAsCString(Compute compute)34 constexpr char const* GetComputeDeviceAsCString(Compute compute)
35 {
36 switch (compute)
37 {
38 case armnn::Compute::CpuRef: return "CpuRef";
39 case armnn::Compute::CpuAcc: return "CpuAcc";
40 case armnn::Compute::GpuAcc: return "GpuAcc";
41 default: return "Unknown";
42 }
43 }
44
45 /// Deprecated function that will be removed together with
46 /// the Compute enum
operator <<(std::ostream & os,const std::vector<Compute> & compute)47 inline std::ostream& operator<<(std::ostream& os, const std::vector<Compute>& compute)
48 {
49 for (const Compute& comp : compute)
50 {
51 os << GetComputeDeviceAsCString(comp) << " ";
52 }
53 return os;
54 }
55
56 /// Deprecated function that will be removed together with
57 /// the Compute enum
operator <<(std::ostream & os,const std::set<Compute> & compute)58 inline std::ostream& operator<<(std::ostream& os, const std::set<Compute>& compute)
59 {
60 for (const Compute& comp : compute)
61 {
62 os << GetComputeDeviceAsCString(comp) << " ";
63 }
64 return os;
65 }
66
67 /// Deprecated function that will be removed together with
68 /// the Compute enum
operator <<(std::ostream & os,const Compute & compute)69 inline std::ostream& operator<<(std::ostream& os, const Compute& compute)
70 {
71 os << GetComputeDeviceAsCString(compute);
72 return os;
73 }
74
75 class BackendId final
76 {
77 public:
BackendId()78 BackendId() : m_Id(GetComputeDeviceAsCString(Compute::Undefined)) {}
BackendId(const std::string & id)79 BackendId(const std::string& id) : m_Id{id} {}
BackendId(const char * id)80 BackendId(const char* id) : m_Id{id} {}
81
82
83 BackendId(const BackendId& other) = default;
84 BackendId(BackendId&& other) = default;
85 BackendId& operator=(const BackendId& other) = default;
86 BackendId& operator=(BackendId&& other) = default;
~BackendId()87 ~BackendId(){}
88
89 /// Deprecated function that will be removed together with
90 /// the Compute enum
BackendId(Compute compute)91 BackendId(Compute compute) : m_Id{GetComputeDeviceAsCString(compute)} {}
92
operator std::string() const93 operator std::string() const { return m_Id; }
operator =(const std::string & other)94 BackendId& operator=(const std::string& other)
95 {
96 m_Id = other;
97 return *this;
98 }
99
100 /// Deprecated function that will be removed together with
101 /// the Compute enum
operator =(Compute compute)102 BackendId& operator=(Compute compute)
103 {
104 BackendId temp{compute};
105 std::swap(temp.m_Id, m_Id);
106 return *this;
107 }
108
operator ==(const BackendId & other) const109 bool operator==(const BackendId& other) const
110 {
111 return m_Id == other.m_Id;
112 }
113
114 /// comparison against objects from which the
115 /// BackendId can be constructed
116 template <typename O>
operator ==(const O & other) const117 bool operator==(const O& other) const
118 {
119 BackendId temp{other};
120 return *this == temp;
121 }
122
123 template <typename O>
operator !=(const O & other) const124 bool operator!=(const O& other) const
125 {
126 return !(*this == other);
127 }
128
operator <(const BackendId & other) const129 bool operator<(const BackendId& other) const
130 {
131 return m_Id < other.m_Id;
132 }
133
IsCpuRef() const134 bool IsCpuRef() const { return m_Id == GetComputeDeviceAsCString(Compute::CpuRef); }
IsCpuAcc() const135 bool IsCpuAcc() const { return m_Id == GetComputeDeviceAsCString(Compute::CpuAcc); }
IsGpuAcc() const136 bool IsGpuAcc() const { return m_Id == GetComputeDeviceAsCString(Compute::GpuAcc); }
137
Get() const138 const std::string& Get() const { return m_Id; }
139
IsEmpty() const140 bool IsEmpty() const { return m_Id.empty(); }
IsUndefined() const141 bool IsUndefined() const { return m_Id == GetComputeDeviceAsCString(Compute::Undefined); }
142
143 private:
144 std::string m_Id;
145 };
146
147 } // namespace armnn
148
149 namespace std
150 {
151
152 /// make BackendId compatible with std hashtables by reusing the hash
153 /// function for strings.
154 /// Note this must come *before* the first use of unordered_set<BackendId>.
155 template <>
156 struct hash<armnn::BackendId>
157 {
operator ()std::hash158 std::size_t operator()(const armnn::BackendId& id) const noexcept
159 {
160 std::hash<std::string> hasher;
161 return hasher(id.Get());
162 }
163 };
164
165 } // namespace std
166
167 namespace armnn
168 {
169
170 namespace profiling
171 {
172 // Static constant describing ArmNN as a dummy backend
173 static const BackendId BACKEND_ID("ARMNN");
174 } // profiling
175
operator <<(std::ostream & os,const BackendId & id)176 inline std::ostream& operator<<(std::ostream& os, const BackendId& id)
177 {
178 os << id.Get();
179 return os;
180 }
181
182 template <template <typename...> class TContainer, typename... TContainerTemplateArgs>
operator <<(std::ostream & os,const TContainer<BackendId,TContainerTemplateArgs...> & ids)183 std::ostream& operator<<(std::ostream& os,
184 const TContainer<BackendId, TContainerTemplateArgs...>& ids)
185 {
186 os << '[';
187 for (const auto& id : ids) { os << id << " "; }
188 os << ']';
189 return os;
190 }
191
192 using BackendIdVector = std::vector<BackendId>;
193 using BackendIdSet = std::unordered_set<BackendId>;
194
195 } // namespace armnn
196