blob: f9c3718e14bf05c718a42523d1eab23a088e7722 [file] [log] [blame]
Laurent Carlier749294b2020-06-01 09:03:17 +01001//
Francis Murtaghd301c0a2022-08-02 19:42:29 +01002// Copyright © 2022 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, \
telsoa01c577f2c2018-08-31 09:22:23 +010027 name, \
Nina Drozd69851b52018-09-21 18:42:09 +010028 armnn::NeonTimer(), \
29 armnn::WallClockTimer())
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +010030
31using namespace armnn::armcomputetensorutils;
32
33namespace armnn
34{
35
Keith Davis5a64f222021-08-04 10:35:20 +010036inline std::string GetConvolutionMethodString(arm_compute::ConvolutionMethod& convolutionMethod)
37{
38 switch (convolutionMethod)
39 {
40 case arm_compute::ConvolutionMethod::FFT:
41 return "FFT";
42 case arm_compute::ConvolutionMethod::DIRECT:
43 return "Direct";
44 case arm_compute::ConvolutionMethod::GEMM:
45 return "GEMM";
46 case arm_compute::ConvolutionMethod::WINOGRAD:
47 return "Winograd";
48 default:
49 return "Unknown";
50 }
51}
52
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +010053template <typename T>
54void CopyArmComputeTensorData(arm_compute::Tensor& dstTensor, const T* srcData)
55{
56 InitialiseArmComputeTensorEmpty(dstTensor);
57 CopyArmComputeITensorData(srcData, dstTensor);
58}
59
60inline void InitializeArmComputeTensorData(arm_compute::Tensor& tensor,
James Conroy1f58f032021-04-27 17:13:27 +010061 const ConstTensorHandle* handle)
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +010062{
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +010063 ARMNN_ASSERT(handle);
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +010064
65 switch(handle->GetTensorInfo().GetDataType())
66 {
67 case DataType::Float16:
68 CopyArmComputeTensorData(tensor, handle->GetConstTensor<armnn::Half>());
69 break;
70 case DataType::Float32:
71 CopyArmComputeTensorData(tensor, handle->GetConstTensor<float>());
72 break;
Derek Lambertif90c56d2020-01-10 17:14:08 +000073 case DataType::QAsymmU8:
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +010074 CopyArmComputeTensorData(tensor, handle->GetConstTensor<uint8_t>());
75 break;
Derek Lambertid466a542020-01-22 15:37:29 +000076 case DataType::QSymmS8:
Sadik Armagane5d0b932020-04-09 15:48:44 +010077 case DataType::QAsymmS8:
Aron Virginas-Tar21fc28b2019-11-26 14:04:54 +000078 CopyArmComputeTensorData(tensor, handle->GetConstTensor<int8_t>());
79 break;
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +010080 case DataType::Signed32:
81 CopyArmComputeTensorData(tensor, handle->GetConstTensor<int32_t>());
82 break;
James Conroycc340932020-05-12 18:08:52 +010083 case DataType::QSymmS16:
84 CopyArmComputeTensorData(tensor, handle->GetConstTensor<int16_t>());
85 break;
Francis Murtaghd301c0a2022-08-02 19:42:29 +010086 case DataType::BFloat16:
87 CopyArmComputeTensorData(tensor, handle->GetConstTensor<armnn::BFloat16>());
88 break;
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +010089 default:
Francis Murtaghd301c0a2022-08-02 19:42:29 +010090 // Throw exception; assertion not called in release build.
91 throw Exception("Unexpected tensor type during InitializeArmComputeTensorData().");
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +010092 }
93};
94
FinnWilliamsArm1fa19192019-08-02 17:26:31 +010095inline auto SetNeonStridedSliceData(const std::vector<int>& m_begin,
96 const std::vector<int>& m_end,
97 const std::vector<int>& m_stride)
98{
99 arm_compute::Coordinates starts;
100 arm_compute::Coordinates ends;
101 arm_compute::Coordinates strides;
102
103 unsigned int num_dims = static_cast<unsigned int>(m_begin.size());
104
105 for (unsigned int i = 0; i < num_dims; i++)
106 {
107 unsigned int revertedIndex = num_dims - i - 1;
108
109 starts.set(i, static_cast<int>(m_begin[revertedIndex]));
110 ends.set(i, static_cast<int>(m_end[revertedIndex]));
111 strides.set(i, static_cast<int>(m_stride[revertedIndex]));
112 }
113
114 return std::make_tuple(starts, ends, strides);
115}
116
josh minor036f02d2019-11-15 14:53:22 -0600117inline auto SetNeonSliceData(const std::vector<unsigned int>& m_begin,
118 const std::vector<unsigned int>& m_size)
119{
120 // This function must translate the size vector given to an end vector
121 // expected by the ACL NESlice workload
122 arm_compute::Coordinates starts;
123 arm_compute::Coordinates ends;
124
125 unsigned int num_dims = static_cast<unsigned int>(m_begin.size());
126
127 // For strided slices, we have the relationship size = (end - begin) / stride
128 // For slice, we assume stride to be a vector of all ones, yielding the formula
129 // size = (end - begin) therefore we know end = size + begin
130 for (unsigned int i = 0; i < num_dims; i++)
131 {
132 unsigned int revertedIndex = num_dims - i - 1;
133
134 starts.set(i, static_cast<int>(m_begin[revertedIndex]));
135 ends.set(i, static_cast<int>(m_begin[revertedIndex] + m_size[revertedIndex]));
136 }
137
138 return std::make_tuple(starts, ends);
139}
140
David Monahan97451b42020-12-03 09:48:06 +0000141template <typename DataType, typename PayloadType>
142DataType* GetOutputTensorData(unsigned int idx, const PayloadType& data)
143{
144 ITensorHandle* tensorHandle = data.m_Outputs[idx];
145 return reinterpret_cast<DataType*>(tensorHandle->Map());
146}
147
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +0100148} //namespace armnn