blob: 5010bbdb0820a759b9ad34d7e02335f689f63aef [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,
54 V1_3::Priority priority = V1_3::Priority::MEDIUM);
Kevin May42477c12020-03-26 13:34:14 +000055
56 virtual ~ArmnnPreparedModel_1_3();
57
58 Return<V1_0::ErrorStatus> execute(const V1_0::Request& request,
59 const sp<V1_0::IExecutionCallback>& callback) override;
60
61 Return<V1_0::ErrorStatus> execute_1_2(const V1_0::Request& request, MeasureTiming measure,
62 const sp<V1_2::IExecutionCallback>& callback) override;
63
64 Return<V1_3::ErrorStatus> execute_1_3(const V1_3::Request& request,
65 V1_2::MeasureTiming measure,
66 const V1_3::OptionalTimePoint&,
Kevin May352d8382020-03-31 15:03:42 +010067 const V1_3::OptionalTimeoutDuration&,
Kevin May42477c12020-03-26 13:34:14 +000068 const sp<V1_3::IExecutionCallback>& callback) override;
69
70 Return<void> executeSynchronously(const V1_0::Request &request,
71 MeasureTiming measure,
72 V1_3::IPreparedModel::executeSynchronously_cb cb) override;
73
74 Return<void> executeSynchronously_1_3(const V1_3::Request &request,
75 MeasureTiming measure,
76 const V1_3::OptionalTimePoint& deadline,
Kevin May352d8382020-03-31 15:03:42 +010077 const V1_3::OptionalTimeoutDuration& loopTimeoutDuration,
Kevin May42477c12020-03-26 13:34:14 +000078 V1_3::IPreparedModel::executeSynchronously_1_3_cb cb) override;
79
80 Return<void> executeFenced(const V1_3::Request& request,
Sadik Armagand7be72e2020-04-23 12:56:05 +010081 const android::hardware::hidl_vec<android::hardware::hidl_handle>& fenceWaitFor,
Kevin May42477c12020-03-26 13:34:14 +000082 MeasureTiming measure,
83 const V1_3::OptionalTimePoint& deadline,
Kevin May352d8382020-03-31 15:03:42 +010084 const V1_3::OptionalTimeoutDuration& loopTimeoutDuration,
Kevin May42477c12020-03-26 13:34:14 +000085 const V1_3::OptionalTimeoutDuration& duration,
86 executeFenced_cb callback) override;
87
88 Return<void> configureExecutionBurst(
89 const sp<V1_2::IBurstCallback>& callback,
90 const android::hardware::MQDescriptorSync<V1_2::FmqRequestDatum>& requestChannel,
91 const android::hardware::MQDescriptorSync<V1_2::FmqResultDatum>& resultChannel,
92 configureExecutionBurst_cb cb) override;
93
94 template<typename CallbackContext>
95 Return<void> ExecuteSynchronously(const V1_3::Request& request, CallbackContext cbCtx);
96
97 /// execute the graph prepared from the request
98 template<typename CallbackContext>
Sadik Armagand7be72e2020-04-23 12:56:05 +010099 Return <V1_3::ErrorStatus> ExecuteGraph(
100 std::shared_ptr<std::vector<::android::nn::RunTimePoolInfo>>& pMemPools,
101 armnn::InputTensors& inputTensors,
102 armnn::OutputTensors& outputTensors,
103 CallbackContext callback);
Kevin May42477c12020-03-26 13:34:14 +0000104
105 /// Executes this model with dummy inputs (e.g. all zeroes).
106 /// \return false on failure, otherwise true
107 bool ExecuteWithDummyInputs();
108
Narumol Prangnawaratcad4e912020-06-02 12:07:43 +0100109 V1_3::Priority GetModelPriority();
110
Kevin May42477c12020-03-26 13:34:14 +0000111private:
112 Return <V1_3::ErrorStatus> Execute(const V1_3::Request& request,
113 MeasureTiming measureTiming,
114 CallbackAsync_1_3 callback);
115
116 Return<V1_3::ErrorStatus> PrepareMemoryForInputs(
117 armnn::InputTensors& inputs,
118 const V1_3::Request& request,
119 const std::vector<android::nn::RunTimePoolInfo>& memPools);
120
121 Return<V1_3::ErrorStatus> PrepareMemoryForOutputs(
122 armnn::OutputTensors& outputs,
123 std::vector<OutputShape> &outputShapes,
124 const V1_3::Request& request,
125 const std::vector<android::nn::RunTimePoolInfo>& memPools);
126
127 std::tuple<V1_3::ErrorStatus, hidl_vec<OutputShape>, Timing, std::string> PrepareMemoryForIO(
128 armnn::InputTensors& inputs,
129 armnn::OutputTensors& outputs,
130 std::vector<android::nn::RunTimePoolInfo>& memPools,
131 const V1_3::Request& request);
132
133 template <typename TensorBindingCollection>
134 void DumpTensorsIfRequired(char const* tensorNamePrefix, const TensorBindingCollection& tensorBindings);
135
136 armnn::NetworkId m_NetworkId;
137 armnn::IRuntime* m_Runtime;
138 V1_3::Model m_Model;
139 // There must be a single RequestThread for all ArmnnPreparedModel objects to ensure serial execution of workloads
140 // It is specific to this class, so it is declared as static here
Narumol Prangnawaratcad4e912020-06-02 12:07:43 +0100141 static RequestThread_1_3<ArmnnPreparedModel_1_3, HalVersion, CallbackContext_1_3> m_RequestThread;
Kevin May42477c12020-03-26 13:34:14 +0000142 uint32_t m_RequestCount;
143 const std::string& m_RequestInputsAndOutputsDumpDir;
144 const bool m_GpuProfilingEnabled;
Narumol Prangnawaratcad4e912020-06-02 12:07:43 +0100145 V1_3::Priority m_ModelPriority;
Kevin May42477c12020-03-26 13:34:14 +0000146};
147
148}