blob: 6c1c5c26ed1a9006119b97da770bdfa94c2a8e25 [file] [log] [blame]
Kevin May42477c12020-03-26 13:34:14 +00001//
2// Copyright © 2020 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
8#include "ArmnnDriver.hpp"
9#include "ArmnnDriverImpl.hpp"
Narumol Prangnawaratcad4e912020-06-02 12:07:43 +010010#include "RequestThread_1_3.hpp"
Kevin May42477c12020-03-26 13:34:14 +000011#include "ModelToINetworkConverter.hpp"
12
13#include <NeuralNetworks.h>
14#include <armnn/ArmNN.hpp>
Finn Williamsca3a3e02021-06-11 15:04:02 +010015#include <armnn/Threadpool.hpp>
16
Kevin May42477c12020-03-26 13:34:14 +000017
18#include <string>
19#include <vector>
20
21namespace armnn_driver
22{
23using CallbackAsync_1_3 = std::function<
24 void(V1_3::ErrorStatus errorStatus,
25 std::vector<::android::hardware::neuralnetworks::V1_2::OutputShape> outputShapes,
26 const ::android::hardware::neuralnetworks::V1_2::Timing& timing,
27 std::string callingFunction)>;
28
29struct ExecutionContext_1_3
30{
31 ::android::hardware::neuralnetworks::V1_2::MeasureTiming measureTimings =
32 ::android::hardware::neuralnetworks::V1_2::MeasureTiming::NO;
33 TimePoint driverStart;
Kevin May949a69e2020-04-24 10:21:40 +010034 TimePoint driverEnd;
Sadik Armagand7be72e2020-04-23 12:56:05 +010035 TimePoint deviceStart;
36 TimePoint deviceEnd;
Kevin May42477c12020-03-26 13:34:14 +000037};
38
39using CallbackContext_1_3 = CallbackContext<CallbackAsync_1_3, ExecutionContext_1_3>;
40
41using executeFenced_cb = std::function<void(::android::hardware::neuralnetworks::V1_3::ErrorStatus status,
42 const ::android::hardware::hidl_handle& syncFence,
43 const ::android::sp<::android::hardware::neuralnetworks::V1_3::IFencedExecutionCallback>& callback)>;
44
45template <typename HalVersion>
46class ArmnnPreparedModel_1_3 : public V1_3::IPreparedModel
47{
48public:
49 using HalModel = typename V1_3::Model;
50
51 ArmnnPreparedModel_1_3(armnn::NetworkId networkId,
52 armnn::IRuntime* runtime,
53 const HalModel& model,
54 const std::string& requestInputsAndOutputsDumpDir,
Narumol Prangnawaratcad4e912020-06-02 12:07:43 +010055 const bool gpuProfilingEnabled,
Finn Williamsd8fb5402021-05-19 20:52:00 +010056 V1_3::Priority priority = V1_3::Priority::MEDIUM,
Finn Williamsca3a3e02021-06-11 15:04:02 +010057 const bool asyncModelExecutionEnabled = false,
Narumol Prangnawaratd1a947f2022-02-07 13:12:24 +000058 const unsigned int numberOfThreads = 1,
David Monahanbe9d99e2022-04-29 16:25:24 +010059 const bool importEnabled = false,
60 const bool exportEnabled = false);
Kevin May42477c12020-03-26 13:34:14 +000061
Sadik Armagan0a2dfab2021-10-06 16:41:44 +010062 ArmnnPreparedModel_1_3(armnn::NetworkId networkId,
63 armnn::IRuntime* runtime,
64 const std::string& requestInputsAndOutputsDumpDir,
65 const bool gpuProfilingEnabled,
66 V1_3::Priority priority = V1_3::Priority::MEDIUM,
67 const bool asyncModelExecutionEnabled = false,
68 const unsigned int numberOfThreads = 1,
David Monahanbe9d99e2022-04-29 16:25:24 +010069 const bool importEnabled = false,
70 const bool exportEnabled = false,
Sadik Armagan0a2dfab2021-10-06 16:41:44 +010071 const bool preparedFromCache = false);
72
Kevin May42477c12020-03-26 13:34:14 +000073 virtual ~ArmnnPreparedModel_1_3();
74
75 Return<V1_0::ErrorStatus> execute(const V1_0::Request& request,
Sadik Armagan188675f2021-02-12 17:16:42 +000076 const ::android::sp<V1_0::IExecutionCallback>& callback) override;
Kevin May42477c12020-03-26 13:34:14 +000077
Sadik Armagan188675f2021-02-12 17:16:42 +000078 Return<V1_0::ErrorStatus> execute_1_2(const V1_0::Request& request, V1_2::MeasureTiming measure,
79 const ::android::sp<V1_2::IExecutionCallback>& callback) override;
Kevin May42477c12020-03-26 13:34:14 +000080
81 Return<V1_3::ErrorStatus> execute_1_3(const V1_3::Request& request,
82 V1_2::MeasureTiming measure,
83 const V1_3::OptionalTimePoint&,
Kevin May352d8382020-03-31 15:03:42 +010084 const V1_3::OptionalTimeoutDuration&,
Sadik Armagan188675f2021-02-12 17:16:42 +000085 const ::android::sp<V1_3::IExecutionCallback>& callback) override;
Kevin May42477c12020-03-26 13:34:14 +000086
87 Return<void> executeSynchronously(const V1_0::Request &request,
Sadik Armagan188675f2021-02-12 17:16:42 +000088 V1_2::MeasureTiming measure,
Kevin May42477c12020-03-26 13:34:14 +000089 V1_3::IPreparedModel::executeSynchronously_cb cb) override;
90
91 Return<void> executeSynchronously_1_3(const V1_3::Request &request,
Sadik Armagan188675f2021-02-12 17:16:42 +000092 V1_2::MeasureTiming measure,
Kevin May42477c12020-03-26 13:34:14 +000093 const V1_3::OptionalTimePoint& deadline,
Kevin May352d8382020-03-31 15:03:42 +010094 const V1_3::OptionalTimeoutDuration& loopTimeoutDuration,
Kevin May42477c12020-03-26 13:34:14 +000095 V1_3::IPreparedModel::executeSynchronously_1_3_cb cb) override;
96
97 Return<void> executeFenced(const V1_3::Request& request,
Sadik Armagand7be72e2020-04-23 12:56:05 +010098 const android::hardware::hidl_vec<android::hardware::hidl_handle>& fenceWaitFor,
Sadik Armagan188675f2021-02-12 17:16:42 +000099 V1_2::MeasureTiming measure,
Kevin May42477c12020-03-26 13:34:14 +0000100 const V1_3::OptionalTimePoint& deadline,
Kevin May352d8382020-03-31 15:03:42 +0100101 const V1_3::OptionalTimeoutDuration& loopTimeoutDuration,
Kevin May42477c12020-03-26 13:34:14 +0000102 const V1_3::OptionalTimeoutDuration& duration,
103 executeFenced_cb callback) override;
104
105 Return<void> configureExecutionBurst(
Sadik Armagan188675f2021-02-12 17:16:42 +0000106 const ::android::sp<V1_2::IBurstCallback>& callback,
Kevin May42477c12020-03-26 13:34:14 +0000107 const android::hardware::MQDescriptorSync<V1_2::FmqRequestDatum>& requestChannel,
108 const android::hardware::MQDescriptorSync<V1_2::FmqResultDatum>& resultChannel,
109 configureExecutionBurst_cb cb) override;
110
111 template<typename CallbackContext>
112 Return<void> ExecuteSynchronously(const V1_3::Request& request, CallbackContext cbCtx);
113
114 /// execute the graph prepared from the request
115 template<typename CallbackContext>
Sadik Armagand7be72e2020-04-23 12:56:05 +0100116 Return <V1_3::ErrorStatus> ExecuteGraph(
117 std::shared_ptr<std::vector<::android::nn::RunTimePoolInfo>>& pMemPools,
118 armnn::InputTensors& inputTensors,
119 armnn::OutputTensors& outputTensors,
120 CallbackContext callback);
Kevin May42477c12020-03-26 13:34:14 +0000121
122 /// Executes this model with dummy inputs (e.g. all zeroes).
123 /// \return false on failure, otherwise true
Sadik Armagan0a2dfab2021-10-06 16:41:44 +0100124 bool ExecuteWithDummyInputs(unsigned int numInputs, unsigned int numOutputs);
Kevin May42477c12020-03-26 13:34:14 +0000125
Narumol Prangnawaratcad4e912020-06-02 12:07:43 +0100126 V1_3::Priority GetModelPriority();
127
Kevin May42477c12020-03-26 13:34:14 +0000128private:
Finn Williamsd8fb5402021-05-19 20:52:00 +0100129
130 template<typename CallbackContext>
131 class ArmnnThreadPoolCallback_1_3 : public armnn::IAsyncExecutionCallback
132 {
133 public:
134 ArmnnThreadPoolCallback_1_3(ArmnnPreparedModel_1_3<HalVersion>* model,
135 std::shared_ptr<std::vector<::android::nn::RunTimePoolInfo>>& pMemPools,
136 std::vector<V1_2::OutputShape> outputShapes,
137 std::shared_ptr<armnn::InputTensors>& inputTensors,
138 std::shared_ptr<armnn::OutputTensors>& outputTensors,
139 CallbackContext callbackContext) :
140 m_Model(model),
141 m_MemPools(pMemPools),
142 m_OutputShapes(outputShapes),
143 m_InputTensors(inputTensors),
144 m_OutputTensors(outputTensors),
145 m_CallbackContext(callbackContext)
146 {}
147
148 void Notify(armnn::Status status, armnn::InferenceTimingPair timeTaken) override;
149
Finn Williamsd8fb5402021-05-19 20:52:00 +0100150 ArmnnPreparedModel_1_3<HalVersion>* m_Model;
151 std::shared_ptr<std::vector<::android::nn::RunTimePoolInfo>> m_MemPools;
152 std::vector<V1_2::OutputShape> m_OutputShapes;
153 std::shared_ptr<armnn::InputTensors> m_InputTensors;
154 std::shared_ptr<armnn::OutputTensors> m_OutputTensors;
155 CallbackContext m_CallbackContext;
156 };
157
Kevin May42477c12020-03-26 13:34:14 +0000158 Return <V1_3::ErrorStatus> Execute(const V1_3::Request& request,
Sadik Armagan188675f2021-02-12 17:16:42 +0000159 V1_2::MeasureTiming measureTiming,
Kevin May42477c12020-03-26 13:34:14 +0000160 CallbackAsync_1_3 callback);
161
162 Return<V1_3::ErrorStatus> PrepareMemoryForInputs(
163 armnn::InputTensors& inputs,
164 const V1_3::Request& request,
165 const std::vector<android::nn::RunTimePoolInfo>& memPools);
166
167 Return<V1_3::ErrorStatus> PrepareMemoryForOutputs(
168 armnn::OutputTensors& outputs,
Sadik Armagan188675f2021-02-12 17:16:42 +0000169 std::vector<V1_2::OutputShape> &outputShapes,
Kevin May42477c12020-03-26 13:34:14 +0000170 const V1_3::Request& request,
171 const std::vector<android::nn::RunTimePoolInfo>& memPools);
172
Sadik Armagan188675f2021-02-12 17:16:42 +0000173 std::tuple<V1_3::ErrorStatus, hidl_vec<V1_2::OutputShape>, V1_2::Timing, std::string> PrepareMemoryForIO(
Kevin May42477c12020-03-26 13:34:14 +0000174 armnn::InputTensors& inputs,
175 armnn::OutputTensors& outputs,
176 std::vector<android::nn::RunTimePoolInfo>& memPools,
177 const V1_3::Request& request);
178
179 template <typename TensorBindingCollection>
180 void DumpTensorsIfRequired(char const* tensorNamePrefix, const TensorBindingCollection& tensorBindings);
181
Finn Williamsd8fb5402021-05-19 20:52:00 +0100182 /// schedule the graph prepared from the request for execution
183 template<typename CallbackContext>
184 void ScheduleGraphForExecution(
185 std::shared_ptr<std::vector<::android::nn::RunTimePoolInfo>>& pMemPools,
186 std::shared_ptr<armnn::InputTensors>& inputTensors,
187 std::shared_ptr<armnn::OutputTensors>& outputTensors,
188 CallbackContext m_CallbackContext,
189 armnn::QosExecPriority priority);
190
Finn Williamsfdf2eae2021-07-08 13:07:19 +0100191 armnn::NetworkId m_NetworkId;
192 armnn::IRuntime* m_Runtime;
193 V1_3::Model m_Model;
Kevin May42477c12020-03-26 13:34:14 +0000194 // There must be a single RequestThread for all ArmnnPreparedModel objects to ensure serial execution of workloads
195 // It is specific to this class, so it is declared as static here
Finn Williamsfdf2eae2021-07-08 13:07:19 +0100196 static RequestThread_1_3<ArmnnPreparedModel_1_3,
197 HalVersion,
198 CallbackContext_1_3> m_RequestThread;
199 uint32_t m_RequestCount;
200 const std::string& m_RequestInputsAndOutputsDumpDir;
201 const bool m_GpuProfilingEnabled;
202 V1_3::Priority m_ModelPriority;
Finn Williamsd8fb5402021-05-19 20:52:00 +0100203
Finn Williamsfdf2eae2021-07-08 13:07:19 +0100204 // Static to allow sharing of threadpool between ArmnnPreparedModel instances
205 static std::unique_ptr<armnn::Threadpool> m_Threadpool;
206 std::shared_ptr<IWorkingMemHandle> m_WorkingMemHandle;
207 const bool m_AsyncModelExecutionEnabled;
Narumol Prangnawaratd1a947f2022-02-07 13:12:24 +0000208 const bool m_EnableImport;
209 const bool m_EnableExport;
Sadik Armagan0a2dfab2021-10-06 16:41:44 +0100210 const bool m_PreparedFromCache;
Kevin May42477c12020-03-26 13:34:14 +0000211};
212
213}