blob: 694c3ab9287ff43be8a310b577b720e5c25d2584 [file] [log] [blame]
Laurent Carlier749294b2020-06-01 09:03:17 +01001//
Mike Kelly7cbe7812023-07-25 17:37:33 +01002// Copyright © 2017-2023 Arm Ltd and Contributors. All rights reserved.
David Beckecb56cd2018-09-05 12:52:57 +01003// SPDX-License-Identifier: MIT
telsoa014fcda012018-03-09 14:13:49 +00004//
5#pragma once
6
Colm Donelan0c479742021-12-10 12:43:54 +00007#include <armnn/backends/Workload.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00008#include <aclCommon/ArmComputeTensorUtils.hpp>
9#include <neon/NeonTensorHandle.hpp>
10#include <neon/NeonTimer.hpp>
Colm Donelan0c479742021-12-10 12:43:54 +000011#include <armnn/backends/TensorHandle.hpp>
telsoa014fcda012018-03-09 14:13:49 +000012
Derek Lambertid466a542020-01-22 15:37:29 +000013#include <armnn/Utils.hpp>
14
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +010015#include <Half.hpp>
telsoa014fcda012018-03-09 14:13:49 +000016
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +010017#define ARMNN_SCOPED_PROFILING_EVENT_NEON(name) \
telsoa01c577f2c2018-08-31 09:22:23 +010018 ARMNN_SCOPED_PROFILING_EVENT_WITH_INSTRUMENTS(armnn::Compute::CpuAcc, \
Keith Davis5a64f222021-08-04 10:35:20 +010019 armnn::EmptyOptional(), \
20 name, \
21 armnn::NeonTimer(), \
22 armnn::WallClockTimer())
23
24#define ARMNN_SCOPED_PROFILING_EVENT_NEON_GUID(name, guid) \
25 ARMNN_SCOPED_PROFILING_EVENT_WITH_INSTRUMENTS(armnn::Compute::CpuAcc, \
26 guid, \
Mike Kelly7cbe7812023-07-25 17:37:33 +010027 GetName() + "_" + name, \
28 armnn::NeonTimer(), \
29 armnn::WallClockTimer())
30
31/// Creates a profiling event that uses GetGuid() and GetName() from the calling class
32#define ARMNN_SCOPED_PROFILING_EVENT_NEON_NAME_GUID(label) \
33 ARMNN_SCOPED_PROFILING_EVENT_WITH_INSTRUMENTS(armnn::Compute::CpuAcc, \
34 this->GetGuid(), \
35 this->GetName() + "_" + label, \
Nina Drozd69851b52018-09-21 18:42:09 +010036 armnn::NeonTimer(), \
37 armnn::WallClockTimer())
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +010038
39using namespace armnn::armcomputetensorutils;
40
41namespace armnn
42{
43
Keith Davis5a64f222021-08-04 10:35:20 +010044inline std::string GetConvolutionMethodString(arm_compute::ConvolutionMethod& convolutionMethod)
45{
46 switch (convolutionMethod)
47 {
48 case arm_compute::ConvolutionMethod::FFT:
49 return "FFT";
50 case arm_compute::ConvolutionMethod::DIRECT:
51 return "Direct";
52 case arm_compute::ConvolutionMethod::GEMM:
53 return "GEMM";
54 case arm_compute::ConvolutionMethod::WINOGRAD:
55 return "Winograd";
56 default:
57 return "Unknown";
58 }
59}
60
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +010061template <typename T>
62void CopyArmComputeTensorData(arm_compute::Tensor& dstTensor, const T* srcData)
63{
64 InitialiseArmComputeTensorEmpty(dstTensor);
65 CopyArmComputeITensorData(srcData, dstTensor);
66}
67
68inline void InitializeArmComputeTensorData(arm_compute::Tensor& tensor,
Mike Kellyec67a0f2022-11-25 13:55:24 +000069 TensorInfo tensorInfo,
70 const ITensorHandle* handle)
71{
72 ARMNN_ASSERT(handle);
73
74 switch(tensorInfo.GetDataType())
75 {
76 case DataType::Float16:
77 CopyArmComputeTensorData(tensor, reinterpret_cast<const armnn::Half*>(handle->Map()));
78 break;
79 case DataType::Float32:
80 CopyArmComputeTensorData(tensor, reinterpret_cast<const float*>(handle->Map()));
81 break;
82 case DataType::QAsymmU8:
83 CopyArmComputeTensorData(tensor, reinterpret_cast<const uint8_t*>(handle->Map()));
84 break;
85 case DataType::QSymmS8:
86 case DataType::QAsymmS8:
87 CopyArmComputeTensorData(tensor, reinterpret_cast<const int8_t*>(handle->Map()));
88 break;
89 case DataType::Signed32:
90 CopyArmComputeTensorData(tensor, reinterpret_cast<const int32_t*>(handle->Map()));
91 break;
92 case DataType::QSymmS16:
93 CopyArmComputeTensorData(tensor, reinterpret_cast<const int16_t*>(handle->Map()));
94 break;
95 case DataType::BFloat16:
96 CopyArmComputeTensorData(tensor, reinterpret_cast<const armnn::BFloat16*>(handle->Map()));
97 break;
98 default:
99 // Throw exception; assertion not called in release build.
100 throw Exception("Unexpected tensor type during InitializeArmComputeTensorData().");
101 }
102};
103
104inline void InitializeArmComputeTensorData(arm_compute::Tensor& tensor,
James Conroy1f58f032021-04-27 17:13:27 +0100105 const ConstTensorHandle* handle)
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +0100106{
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +0100107 ARMNN_ASSERT(handle);
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +0100108
109 switch(handle->GetTensorInfo().GetDataType())
110 {
111 case DataType::Float16:
112 CopyArmComputeTensorData(tensor, handle->GetConstTensor<armnn::Half>());
113 break;
114 case DataType::Float32:
115 CopyArmComputeTensorData(tensor, handle->GetConstTensor<float>());
116 break;
Derek Lambertif90c56d2020-01-10 17:14:08 +0000117 case DataType::QAsymmU8:
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +0100118 CopyArmComputeTensorData(tensor, handle->GetConstTensor<uint8_t>());
119 break;
Derek Lambertid466a542020-01-22 15:37:29 +0000120 case DataType::QSymmS8:
Sadik Armagane5d0b932020-04-09 15:48:44 +0100121 case DataType::QAsymmS8:
Aron Virginas-Tar21fc28b2019-11-26 14:04:54 +0000122 CopyArmComputeTensorData(tensor, handle->GetConstTensor<int8_t>());
123 break;
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +0100124 case DataType::Signed32:
125 CopyArmComputeTensorData(tensor, handle->GetConstTensor<int32_t>());
126 break;
James Conroycc340932020-05-12 18:08:52 +0100127 case DataType::QSymmS16:
128 CopyArmComputeTensorData(tensor, handle->GetConstTensor<int16_t>());
129 break;
Francis Murtaghd301c0a2022-08-02 19:42:29 +0100130 case DataType::BFloat16:
131 CopyArmComputeTensorData(tensor, handle->GetConstTensor<armnn::BFloat16>());
132 break;
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +0100133 default:
Francis Murtaghd301c0a2022-08-02 19:42:29 +0100134 // Throw exception; assertion not called in release build.
135 throw Exception("Unexpected tensor type during InitializeArmComputeTensorData().");
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +0100136 }
137};
138
FinnWilliamsArm1fa19192019-08-02 17:26:31 +0100139inline auto SetNeonStridedSliceData(const std::vector<int>& m_begin,
140 const std::vector<int>& m_end,
141 const std::vector<int>& m_stride)
142{
143 arm_compute::Coordinates starts;
144 arm_compute::Coordinates ends;
145 arm_compute::Coordinates strides;
146
147 unsigned int num_dims = static_cast<unsigned int>(m_begin.size());
148
149 for (unsigned int i = 0; i < num_dims; i++)
150 {
151 unsigned int revertedIndex = num_dims - i - 1;
152
153 starts.set(i, static_cast<int>(m_begin[revertedIndex]));
154 ends.set(i, static_cast<int>(m_end[revertedIndex]));
155 strides.set(i, static_cast<int>(m_stride[revertedIndex]));
156 }
157
158 return std::make_tuple(starts, ends, strides);
159}
160
josh minor036f02d2019-11-15 14:53:22 -0600161inline auto SetNeonSliceData(const std::vector<unsigned int>& m_begin,
162 const std::vector<unsigned int>& m_size)
163{
164 // This function must translate the size vector given to an end vector
165 // expected by the ACL NESlice workload
166 arm_compute::Coordinates starts;
167 arm_compute::Coordinates ends;
168
169 unsigned int num_dims = static_cast<unsigned int>(m_begin.size());
170
171 // For strided slices, we have the relationship size = (end - begin) / stride
172 // For slice, we assume stride to be a vector of all ones, yielding the formula
173 // size = (end - begin) therefore we know end = size + begin
174 for (unsigned int i = 0; i < num_dims; i++)
175 {
176 unsigned int revertedIndex = num_dims - i - 1;
177
178 starts.set(i, static_cast<int>(m_begin[revertedIndex]));
179 ends.set(i, static_cast<int>(m_begin[revertedIndex] + m_size[revertedIndex]));
180 }
181
182 return std::make_tuple(starts, ends);
183}
184
David Monahan97451b42020-12-03 09:48:06 +0000185template <typename DataType, typename PayloadType>
186DataType* GetOutputTensorData(unsigned int idx, const PayloadType& data)
187{
188 ITensorHandle* tensorHandle = data.m_Outputs[idx];
189 return reinterpret_cast<DataType*>(tensorHandle->Map());
190}
191
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +0100192} //namespace armnn