blob: 247149c8f518497ed520352f6de431dfc2a4b014 [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"
10#include "RequestThread.hpp"
11#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;
32};
33
34using CallbackContext_1_3 = CallbackContext<CallbackAsync_1_3, ExecutionContext_1_3>;
35
36using executeFenced_cb = std::function<void(::android::hardware::neuralnetworks::V1_3::ErrorStatus status,
37 const ::android::hardware::hidl_handle& syncFence,
38 const ::android::sp<::android::hardware::neuralnetworks::V1_3::IFencedExecutionCallback>& callback)>;
39
40template <typename HalVersion>
41class ArmnnPreparedModel_1_3 : public V1_3::IPreparedModel
42{
43public:
44 using HalModel = typename V1_3::Model;
45
46 ArmnnPreparedModel_1_3(armnn::NetworkId networkId,
47 armnn::IRuntime* runtime,
48 const HalModel& model,
49 const std::string& requestInputsAndOutputsDumpDir,
50 const bool gpuProfilingEnabled);
51
52 virtual ~ArmnnPreparedModel_1_3();
53
54 Return<V1_0::ErrorStatus> execute(const V1_0::Request& request,
55 const sp<V1_0::IExecutionCallback>& callback) override;
56
57 Return<V1_0::ErrorStatus> execute_1_2(const V1_0::Request& request, MeasureTiming measure,
58 const sp<V1_2::IExecutionCallback>& callback) override;
59
60 Return<V1_3::ErrorStatus> execute_1_3(const V1_3::Request& request,
61 V1_2::MeasureTiming measure,
62 const V1_3::OptionalTimePoint&,
63 const sp<V1_3::IExecutionCallback>& callback) override;
64
65 Return<void> executeSynchronously(const V1_0::Request &request,
66 MeasureTiming measure,
67 V1_3::IPreparedModel::executeSynchronously_cb cb) override;
68
69 Return<void> executeSynchronously_1_3(const V1_3::Request &request,
70 MeasureTiming measure,
71 const V1_3::OptionalTimePoint& deadline,
72 V1_3::IPreparedModel::executeSynchronously_1_3_cb cb) override;
73
74 Return<void> executeFenced(const V1_3::Request& request,
75 const android::hardware::hidl_vec<android::hardware::hidl_handle>& wait_for,
76 MeasureTiming measure,
77 const V1_3::OptionalTimePoint& deadline,
78 const V1_3::OptionalTimeoutDuration& duration,
79 executeFenced_cb callback) override;
80
81 Return<void> configureExecutionBurst(
82 const sp<V1_2::IBurstCallback>& callback,
83 const android::hardware::MQDescriptorSync<V1_2::FmqRequestDatum>& requestChannel,
84 const android::hardware::MQDescriptorSync<V1_2::FmqResultDatum>& resultChannel,
85 configureExecutionBurst_cb cb) override;
86
87 template<typename CallbackContext>
88 Return<void> ExecuteSynchronously(const V1_3::Request& request, CallbackContext cbCtx);
89
90 /// execute the graph prepared from the request
91 template<typename CallbackContext>
92 bool ExecuteGraph(std::shared_ptr<std::vector<::android::nn::RunTimePoolInfo>>& pMemPools,
93 armnn::InputTensors& inputTensors,
94 armnn::OutputTensors& outputTensors,
95 CallbackContext callback);
96
97 /// Executes this model with dummy inputs (e.g. all zeroes).
98 /// \return false on failure, otherwise true
99 bool ExecuteWithDummyInputs();
100
101private:
102 Return <V1_3::ErrorStatus> Execute(const V1_3::Request& request,
103 MeasureTiming measureTiming,
104 CallbackAsync_1_3 callback);
105
106 Return<V1_3::ErrorStatus> PrepareMemoryForInputs(
107 armnn::InputTensors& inputs,
108 const V1_3::Request& request,
109 const std::vector<android::nn::RunTimePoolInfo>& memPools);
110
111 Return<V1_3::ErrorStatus> PrepareMemoryForOutputs(
112 armnn::OutputTensors& outputs,
113 std::vector<OutputShape> &outputShapes,
114 const V1_3::Request& request,
115 const std::vector<android::nn::RunTimePoolInfo>& memPools);
116
117 std::tuple<V1_3::ErrorStatus, hidl_vec<OutputShape>, Timing, std::string> PrepareMemoryForIO(
118 armnn::InputTensors& inputs,
119 armnn::OutputTensors& outputs,
120 std::vector<android::nn::RunTimePoolInfo>& memPools,
121 const V1_3::Request& request);
122
123 template <typename TensorBindingCollection>
124 void DumpTensorsIfRequired(char const* tensorNamePrefix, const TensorBindingCollection& tensorBindings);
125
126 armnn::NetworkId m_NetworkId;
127 armnn::IRuntime* m_Runtime;
128 V1_3::Model m_Model;
129 // There must be a single RequestThread for all ArmnnPreparedModel objects to ensure serial execution of workloads
130 // It is specific to this class, so it is declared as static here
131 static RequestThread<ArmnnPreparedModel_1_3, HalVersion, CallbackContext_1_3> m_RequestThread;
132 uint32_t m_RequestCount;
133 const std::string& m_RequestInputsAndOutputsDumpDir;
134 const bool m_GpuProfilingEnabled;
135};
136
137}