blob: 11299cc47c7a92e2560219104b347242a9a21b82 [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>
15
16#include <string>
17#include <vector>
18
19namespace armnn_driver
20{
21using CallbackAsync_1_3 = std::function<
22 void(V1_3::ErrorStatus errorStatus,
23 std::vector<::android::hardware::neuralnetworks::V1_2::OutputShape> outputShapes,
24 const ::android::hardware::neuralnetworks::V1_2::Timing& timing,
25 std::string callingFunction)>;
26
27struct ExecutionContext_1_3
28{
29 ::android::hardware::neuralnetworks::V1_2::MeasureTiming measureTimings =
30 ::android::hardware::neuralnetworks::V1_2::MeasureTiming::NO;
31 TimePoint driverStart;
Kevin May949a69e2020-04-24 10:21:40 +010032 TimePoint driverEnd;
Sadik Armagand7be72e2020-04-23 12:56:05 +010033 TimePoint deviceStart;
34 TimePoint deviceEnd;
Kevin May42477c12020-03-26 13:34:14 +000035};
36
37using CallbackContext_1_3 = CallbackContext<CallbackAsync_1_3, ExecutionContext_1_3>;
38
39using executeFenced_cb = std::function<void(::android::hardware::neuralnetworks::V1_3::ErrorStatus status,
40 const ::android::hardware::hidl_handle& syncFence,
41 const ::android::sp<::android::hardware::neuralnetworks::V1_3::IFencedExecutionCallback>& callback)>;
42
43template <typename HalVersion>
44class ArmnnPreparedModel_1_3 : public V1_3::IPreparedModel
45{
46public:
47 using HalModel = typename V1_3::Model;
48
49 ArmnnPreparedModel_1_3(armnn::NetworkId networkId,
50 armnn::IRuntime* runtime,
51 const HalModel& model,
52 const std::string& requestInputsAndOutputsDumpDir,
Narumol Prangnawaratcad4e912020-06-02 12:07:43 +010053 const bool gpuProfilingEnabled,
Finn Williamsd8fb5402021-05-19 20:52:00 +010054 V1_3::Priority priority = V1_3::Priority::MEDIUM,
55 const bool asyncModelExecutionEnabled = false);
Kevin May42477c12020-03-26 13:34:14 +000056
57 virtual ~ArmnnPreparedModel_1_3();
58
59 Return<V1_0::ErrorStatus> execute(const V1_0::Request& request,
Sadik Armagan188675f2021-02-12 17:16:42 +000060 const ::android::sp<V1_0::IExecutionCallback>& callback) override;
Kevin May42477c12020-03-26 13:34:14 +000061
Sadik Armagan188675f2021-02-12 17:16:42 +000062 Return<V1_0::ErrorStatus> execute_1_2(const V1_0::Request& request, V1_2::MeasureTiming measure,
63 const ::android::sp<V1_2::IExecutionCallback>& callback) override;
Kevin May42477c12020-03-26 13:34:14 +000064
65 Return<V1_3::ErrorStatus> execute_1_3(const V1_3::Request& request,
66 V1_2::MeasureTiming measure,
67 const V1_3::OptionalTimePoint&,
Kevin May352d8382020-03-31 15:03:42 +010068 const V1_3::OptionalTimeoutDuration&,
Sadik Armagan188675f2021-02-12 17:16:42 +000069 const ::android::sp<V1_3::IExecutionCallback>& callback) override;
Kevin May42477c12020-03-26 13:34:14 +000070
71 Return<void> executeSynchronously(const V1_0::Request &request,
Sadik Armagan188675f2021-02-12 17:16:42 +000072 V1_2::MeasureTiming measure,
Kevin May42477c12020-03-26 13:34:14 +000073 V1_3::IPreparedModel::executeSynchronously_cb cb) override;
74
75 Return<void> executeSynchronously_1_3(const V1_3::Request &request,
Sadik Armagan188675f2021-02-12 17:16:42 +000076 V1_2::MeasureTiming measure,
Kevin May42477c12020-03-26 13:34:14 +000077 const V1_3::OptionalTimePoint& deadline,
Kevin May352d8382020-03-31 15:03:42 +010078 const V1_3::OptionalTimeoutDuration& loopTimeoutDuration,
Kevin May42477c12020-03-26 13:34:14 +000079 V1_3::IPreparedModel::executeSynchronously_1_3_cb cb) override;
80
81 Return<void> executeFenced(const V1_3::Request& request,
Sadik Armagand7be72e2020-04-23 12:56:05 +010082 const android::hardware::hidl_vec<android::hardware::hidl_handle>& fenceWaitFor,
Sadik Armagan188675f2021-02-12 17:16:42 +000083 V1_2::MeasureTiming measure,
Kevin May42477c12020-03-26 13:34:14 +000084 const V1_3::OptionalTimePoint& deadline,
Kevin May352d8382020-03-31 15:03:42 +010085 const V1_3::OptionalTimeoutDuration& loopTimeoutDuration,
Kevin May42477c12020-03-26 13:34:14 +000086 const V1_3::OptionalTimeoutDuration& duration,
87 executeFenced_cb callback) override;
88
89 Return<void> configureExecutionBurst(
Sadik Armagan188675f2021-02-12 17:16:42 +000090 const ::android::sp<V1_2::IBurstCallback>& callback,
Kevin May42477c12020-03-26 13:34:14 +000091 const android::hardware::MQDescriptorSync<V1_2::FmqRequestDatum>& requestChannel,
92 const android::hardware::MQDescriptorSync<V1_2::FmqResultDatum>& resultChannel,
93 configureExecutionBurst_cb cb) override;
94
95 template<typename CallbackContext>
96 Return<void> ExecuteSynchronously(const V1_3::Request& request, CallbackContext cbCtx);
97
98 /// execute the graph prepared from the request
99 template<typename CallbackContext>
Sadik Armagand7be72e2020-04-23 12:56:05 +0100100 Return <V1_3::ErrorStatus> ExecuteGraph(
101 std::shared_ptr<std::vector<::android::nn::RunTimePoolInfo>>& pMemPools,
102 armnn::InputTensors& inputTensors,
103 armnn::OutputTensors& outputTensors,
104 CallbackContext callback);
Kevin May42477c12020-03-26 13:34:14 +0000105
106 /// Executes this model with dummy inputs (e.g. all zeroes).
107 /// \return false on failure, otherwise true
108 bool ExecuteWithDummyInputs();
109
Narumol Prangnawaratcad4e912020-06-02 12:07:43 +0100110 V1_3::Priority GetModelPriority();
111
Kevin May42477c12020-03-26 13:34:14 +0000112private:
Finn Williamsd8fb5402021-05-19 20:52:00 +0100113
114 template<typename CallbackContext>
115 class ArmnnThreadPoolCallback_1_3 : public armnn::IAsyncExecutionCallback
116 {
117 public:
118 ArmnnThreadPoolCallback_1_3(ArmnnPreparedModel_1_3<HalVersion>* model,
119 std::shared_ptr<std::vector<::android::nn::RunTimePoolInfo>>& pMemPools,
120 std::vector<V1_2::OutputShape> outputShapes,
121 std::shared_ptr<armnn::InputTensors>& inputTensors,
122 std::shared_ptr<armnn::OutputTensors>& outputTensors,
123 CallbackContext callbackContext) :
124 m_Model(model),
125 m_MemPools(pMemPools),
126 m_OutputShapes(outputShapes),
127 m_InputTensors(inputTensors),
128 m_OutputTensors(outputTensors),
129 m_CallbackContext(callbackContext)
130 {}
131
132 void Notify(armnn::Status status, armnn::InferenceTimingPair timeTaken) override;
133
134 // Retrieve the Arm NN Status from the AsyncExecutionCallback that has been notified
135 virtual armnn::Status GetStatus() const override
136 {
137 return armnn::Status::Success;
138 }
139
140 // Block the calling thread until the AsyncExecutionCallback object allows it to proceed
141 virtual void Wait() const override
142 {}
143
144 // Retrieve the start time before executing the inference
145 virtual armnn::HighResolutionClock GetStartTime() const override
146 {
147 return std::chrono::high_resolution_clock::now();
148 }
149
150 // Retrieve the time after executing the inference
151 virtual armnn::HighResolutionClock GetEndTime() const override
152 {
153 return std::chrono::high_resolution_clock::now();
154 }
155
156 ArmnnPreparedModel_1_3<HalVersion>* m_Model;
157 std::shared_ptr<std::vector<::android::nn::RunTimePoolInfo>> m_MemPools;
158 std::vector<V1_2::OutputShape> m_OutputShapes;
159 std::shared_ptr<armnn::InputTensors> m_InputTensors;
160 std::shared_ptr<armnn::OutputTensors> m_OutputTensors;
161 CallbackContext m_CallbackContext;
162 };
163
Kevin May42477c12020-03-26 13:34:14 +0000164 Return <V1_3::ErrorStatus> Execute(const V1_3::Request& request,
Sadik Armagan188675f2021-02-12 17:16:42 +0000165 V1_2::MeasureTiming measureTiming,
Kevin May42477c12020-03-26 13:34:14 +0000166 CallbackAsync_1_3 callback);
167
168 Return<V1_3::ErrorStatus> PrepareMemoryForInputs(
169 armnn::InputTensors& inputs,
170 const V1_3::Request& request,
171 const std::vector<android::nn::RunTimePoolInfo>& memPools);
172
173 Return<V1_3::ErrorStatus> PrepareMemoryForOutputs(
174 armnn::OutputTensors& outputs,
Sadik Armagan188675f2021-02-12 17:16:42 +0000175 std::vector<V1_2::OutputShape> &outputShapes,
Kevin May42477c12020-03-26 13:34:14 +0000176 const V1_3::Request& request,
177 const std::vector<android::nn::RunTimePoolInfo>& memPools);
178
Sadik Armagan188675f2021-02-12 17:16:42 +0000179 std::tuple<V1_3::ErrorStatus, hidl_vec<V1_2::OutputShape>, V1_2::Timing, std::string> PrepareMemoryForIO(
Kevin May42477c12020-03-26 13:34:14 +0000180 armnn::InputTensors& inputs,
181 armnn::OutputTensors& outputs,
182 std::vector<android::nn::RunTimePoolInfo>& memPools,
183 const V1_3::Request& request);
184
185 template <typename TensorBindingCollection>
186 void DumpTensorsIfRequired(char const* tensorNamePrefix, const TensorBindingCollection& tensorBindings);
187
Finn Williamsd8fb5402021-05-19 20:52:00 +0100188 /// schedule the graph prepared from the request for execution
189 template<typename CallbackContext>
190 void ScheduleGraphForExecution(
191 std::shared_ptr<std::vector<::android::nn::RunTimePoolInfo>>& pMemPools,
192 std::shared_ptr<armnn::InputTensors>& inputTensors,
193 std::shared_ptr<armnn::OutputTensors>& outputTensors,
194 CallbackContext m_CallbackContext,
195 armnn::QosExecPriority priority);
196
Kevin May42477c12020-03-26 13:34:14 +0000197 armnn::NetworkId m_NetworkId;
198 armnn::IRuntime* m_Runtime;
199 V1_3::Model m_Model;
200 // There must be a single RequestThread for all ArmnnPreparedModel objects to ensure serial execution of workloads
201 // It is specific to this class, so it is declared as static here
Narumol Prangnawaratcad4e912020-06-02 12:07:43 +0100202 static RequestThread_1_3<ArmnnPreparedModel_1_3, HalVersion, CallbackContext_1_3> m_RequestThread;
Kevin May42477c12020-03-26 13:34:14 +0000203 uint32_t m_RequestCount;
204 const std::string& m_RequestInputsAndOutputsDumpDir;
205 const bool m_GpuProfilingEnabled;
Narumol Prangnawaratcad4e912020-06-02 12:07:43 +0100206 V1_3::Priority m_ModelPriority;
Finn Williamsd8fb5402021-05-19 20:52:00 +0100207
208 std::unique_ptr<IWorkingMemHandle> m_WorkingMemHandle;
209 const bool m_AsyncModelExecutionEnabled;
Kevin May42477c12020-03-26 13:34:14 +0000210};
211
212}