blob: cd5fc0ed175723467acfb139159cd478a1adf98d [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,
58 const unsigned int numberOfThreads = 1);
Kevin May42477c12020-03-26 13:34:14 +000059
Sadik Armagan0a2dfab2021-10-06 16:41:44 +010060 ArmnnPreparedModel_1_3(armnn::NetworkId networkId,
61 armnn::IRuntime* runtime,
62 const std::string& requestInputsAndOutputsDumpDir,
63 const bool gpuProfilingEnabled,
64 V1_3::Priority priority = V1_3::Priority::MEDIUM,
65 const bool asyncModelExecutionEnabled = false,
66 const unsigned int numberOfThreads = 1,
67 const bool preparedFromCache = false);
68
Kevin May42477c12020-03-26 13:34:14 +000069 virtual ~ArmnnPreparedModel_1_3();
70
71 Return<V1_0::ErrorStatus> execute(const V1_0::Request& request,
Sadik Armagan188675f2021-02-12 17:16:42 +000072 const ::android::sp<V1_0::IExecutionCallback>& callback) override;
Kevin May42477c12020-03-26 13:34:14 +000073
Sadik Armagan188675f2021-02-12 17:16:42 +000074 Return<V1_0::ErrorStatus> execute_1_2(const V1_0::Request& request, V1_2::MeasureTiming measure,
75 const ::android::sp<V1_2::IExecutionCallback>& callback) override;
Kevin May42477c12020-03-26 13:34:14 +000076
77 Return<V1_3::ErrorStatus> execute_1_3(const V1_3::Request& request,
78 V1_2::MeasureTiming measure,
79 const V1_3::OptionalTimePoint&,
Kevin May352d8382020-03-31 15:03:42 +010080 const V1_3::OptionalTimeoutDuration&,
Sadik Armagan188675f2021-02-12 17:16:42 +000081 const ::android::sp<V1_3::IExecutionCallback>& callback) override;
Kevin May42477c12020-03-26 13:34:14 +000082
83 Return<void> executeSynchronously(const V1_0::Request &request,
Sadik Armagan188675f2021-02-12 17:16:42 +000084 V1_2::MeasureTiming measure,
Kevin May42477c12020-03-26 13:34:14 +000085 V1_3::IPreparedModel::executeSynchronously_cb cb) override;
86
87 Return<void> executeSynchronously_1_3(const V1_3::Request &request,
Sadik Armagan188675f2021-02-12 17:16:42 +000088 V1_2::MeasureTiming measure,
Kevin May42477c12020-03-26 13:34:14 +000089 const V1_3::OptionalTimePoint& deadline,
Kevin May352d8382020-03-31 15:03:42 +010090 const V1_3::OptionalTimeoutDuration& loopTimeoutDuration,
Kevin May42477c12020-03-26 13:34:14 +000091 V1_3::IPreparedModel::executeSynchronously_1_3_cb cb) override;
92
93 Return<void> executeFenced(const V1_3::Request& request,
Sadik Armagand7be72e2020-04-23 12:56:05 +010094 const android::hardware::hidl_vec<android::hardware::hidl_handle>& fenceWaitFor,
Sadik Armagan188675f2021-02-12 17:16:42 +000095 V1_2::MeasureTiming measure,
Kevin May42477c12020-03-26 13:34:14 +000096 const V1_3::OptionalTimePoint& deadline,
Kevin May352d8382020-03-31 15:03:42 +010097 const V1_3::OptionalTimeoutDuration& loopTimeoutDuration,
Kevin May42477c12020-03-26 13:34:14 +000098 const V1_3::OptionalTimeoutDuration& duration,
99 executeFenced_cb callback) override;
100
101 Return<void> configureExecutionBurst(
Sadik Armagan188675f2021-02-12 17:16:42 +0000102 const ::android::sp<V1_2::IBurstCallback>& callback,
Kevin May42477c12020-03-26 13:34:14 +0000103 const android::hardware::MQDescriptorSync<V1_2::FmqRequestDatum>& requestChannel,
104 const android::hardware::MQDescriptorSync<V1_2::FmqResultDatum>& resultChannel,
105 configureExecutionBurst_cb cb) override;
106
107 template<typename CallbackContext>
108 Return<void> ExecuteSynchronously(const V1_3::Request& request, CallbackContext cbCtx);
109
110 /// execute the graph prepared from the request
111 template<typename CallbackContext>
Sadik Armagand7be72e2020-04-23 12:56:05 +0100112 Return <V1_3::ErrorStatus> ExecuteGraph(
113 std::shared_ptr<std::vector<::android::nn::RunTimePoolInfo>>& pMemPools,
114 armnn::InputTensors& inputTensors,
115 armnn::OutputTensors& outputTensors,
116 CallbackContext callback);
Kevin May42477c12020-03-26 13:34:14 +0000117
118 /// Executes this model with dummy inputs (e.g. all zeroes).
119 /// \return false on failure, otherwise true
Sadik Armagan0a2dfab2021-10-06 16:41:44 +0100120 bool ExecuteWithDummyInputs(unsigned int numInputs, unsigned int numOutputs);
Kevin May42477c12020-03-26 13:34:14 +0000121
Narumol Prangnawaratcad4e912020-06-02 12:07:43 +0100122 V1_3::Priority GetModelPriority();
123
Kevin May42477c12020-03-26 13:34:14 +0000124private:
Finn Williamsd8fb5402021-05-19 20:52:00 +0100125
126 template<typename CallbackContext>
127 class ArmnnThreadPoolCallback_1_3 : public armnn::IAsyncExecutionCallback
128 {
129 public:
130 ArmnnThreadPoolCallback_1_3(ArmnnPreparedModel_1_3<HalVersion>* model,
131 std::shared_ptr<std::vector<::android::nn::RunTimePoolInfo>>& pMemPools,
132 std::vector<V1_2::OutputShape> outputShapes,
133 std::shared_ptr<armnn::InputTensors>& inputTensors,
134 std::shared_ptr<armnn::OutputTensors>& outputTensors,
135 CallbackContext callbackContext) :
136 m_Model(model),
137 m_MemPools(pMemPools),
138 m_OutputShapes(outputShapes),
139 m_InputTensors(inputTensors),
140 m_OutputTensors(outputTensors),
141 m_CallbackContext(callbackContext)
142 {}
143
144 void Notify(armnn::Status status, armnn::InferenceTimingPair timeTaken) override;
145
Finn Williamsd8fb5402021-05-19 20:52:00 +0100146 ArmnnPreparedModel_1_3<HalVersion>* m_Model;
147 std::shared_ptr<std::vector<::android::nn::RunTimePoolInfo>> m_MemPools;
148 std::vector<V1_2::OutputShape> m_OutputShapes;
149 std::shared_ptr<armnn::InputTensors> m_InputTensors;
150 std::shared_ptr<armnn::OutputTensors> m_OutputTensors;
151 CallbackContext m_CallbackContext;
152 };
153
Kevin May42477c12020-03-26 13:34:14 +0000154 Return <V1_3::ErrorStatus> Execute(const V1_3::Request& request,
Sadik Armagan188675f2021-02-12 17:16:42 +0000155 V1_2::MeasureTiming measureTiming,
Kevin May42477c12020-03-26 13:34:14 +0000156 CallbackAsync_1_3 callback);
157
158 Return<V1_3::ErrorStatus> PrepareMemoryForInputs(
159 armnn::InputTensors& inputs,
160 const V1_3::Request& request,
161 const std::vector<android::nn::RunTimePoolInfo>& memPools);
162
163 Return<V1_3::ErrorStatus> PrepareMemoryForOutputs(
164 armnn::OutputTensors& outputs,
Sadik Armagan188675f2021-02-12 17:16:42 +0000165 std::vector<V1_2::OutputShape> &outputShapes,
Kevin May42477c12020-03-26 13:34:14 +0000166 const V1_3::Request& request,
167 const std::vector<android::nn::RunTimePoolInfo>& memPools);
168
Sadik Armagan188675f2021-02-12 17:16:42 +0000169 std::tuple<V1_3::ErrorStatus, hidl_vec<V1_2::OutputShape>, V1_2::Timing, std::string> PrepareMemoryForIO(
Kevin May42477c12020-03-26 13:34:14 +0000170 armnn::InputTensors& inputs,
171 armnn::OutputTensors& outputs,
172 std::vector<android::nn::RunTimePoolInfo>& memPools,
173 const V1_3::Request& request);
174
175 template <typename TensorBindingCollection>
176 void DumpTensorsIfRequired(char const* tensorNamePrefix, const TensorBindingCollection& tensorBindings);
177
Finn Williamsd8fb5402021-05-19 20:52:00 +0100178 /// schedule the graph prepared from the request for execution
179 template<typename CallbackContext>
180 void ScheduleGraphForExecution(
181 std::shared_ptr<std::vector<::android::nn::RunTimePoolInfo>>& pMemPools,
182 std::shared_ptr<armnn::InputTensors>& inputTensors,
183 std::shared_ptr<armnn::OutputTensors>& outputTensors,
184 CallbackContext m_CallbackContext,
185 armnn::QosExecPriority priority);
186
Finn Williamsfdf2eae2021-07-08 13:07:19 +0100187 armnn::NetworkId m_NetworkId;
188 armnn::IRuntime* m_Runtime;
189 V1_3::Model m_Model;
Kevin May42477c12020-03-26 13:34:14 +0000190 // There must be a single RequestThread for all ArmnnPreparedModel objects to ensure serial execution of workloads
191 // It is specific to this class, so it is declared as static here
Finn Williamsfdf2eae2021-07-08 13:07:19 +0100192 static RequestThread_1_3<ArmnnPreparedModel_1_3,
193 HalVersion,
194 CallbackContext_1_3> m_RequestThread;
195 uint32_t m_RequestCount;
196 const std::string& m_RequestInputsAndOutputsDumpDir;
197 const bool m_GpuProfilingEnabled;
198 V1_3::Priority m_ModelPriority;
Finn Williamsd8fb5402021-05-19 20:52:00 +0100199
Finn Williamsfdf2eae2021-07-08 13:07:19 +0100200 // Static to allow sharing of threadpool between ArmnnPreparedModel instances
201 static std::unique_ptr<armnn::Threadpool> m_Threadpool;
202 std::shared_ptr<IWorkingMemHandle> m_WorkingMemHandle;
203 const bool m_AsyncModelExecutionEnabled;
Sadik Armagan0a2dfab2021-10-06 16:41:44 +0100204 const bool m_PreparedFromCache;
Kevin May42477c12020-03-26 13:34:14 +0000205};
206
207}