blob: f51493d383d3f5a2a3bf69b0273d0692981a40a0 [file] [log] [blame]
Laurent Carlier749294b2020-06-01 09:03:17 +01001//
telsoa014fcda012018-03-09 14:13:49 +00002// Copyright © 2017 Arm Ltd. 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
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00007#include <backendsCommon/Workload.hpp>
8#include <aclCommon/ArmComputeTensorUtils.hpp>
9#include <neon/NeonTensorHandle.hpp>
10#include <neon/NeonTimer.hpp>
James Conroy1f58f032021-04-27 17:13:27 +010011#include <backendsCommon/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;
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +010086 default:
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +010087 ARMNN_ASSERT_MSG(false, "Unexpected tensor type.");
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +010088 }
89};
90
FinnWilliamsArm1fa19192019-08-02 17:26:31 +010091inline auto SetNeonStridedSliceData(const std::vector<int>& m_begin,
92 const std::vector<int>& m_end,
93 const std::vector<int>& m_stride)
94{
95 arm_compute::Coordinates starts;
96 arm_compute::Coordinates ends;
97 arm_compute::Coordinates strides;
98
99 unsigned int num_dims = static_cast<unsigned int>(m_begin.size());
100
101 for (unsigned int i = 0; i < num_dims; i++)
102 {
103 unsigned int revertedIndex = num_dims - i - 1;
104
105 starts.set(i, static_cast<int>(m_begin[revertedIndex]));
106 ends.set(i, static_cast<int>(m_end[revertedIndex]));
107 strides.set(i, static_cast<int>(m_stride[revertedIndex]));
108 }
109
110 return std::make_tuple(starts, ends, strides);
111}
112
josh minor036f02d2019-11-15 14:53:22 -0600113inline auto SetNeonSliceData(const std::vector<unsigned int>& m_begin,
114 const std::vector<unsigned int>& m_size)
115{
116 // This function must translate the size vector given to an end vector
117 // expected by the ACL NESlice workload
118 arm_compute::Coordinates starts;
119 arm_compute::Coordinates ends;
120
121 unsigned int num_dims = static_cast<unsigned int>(m_begin.size());
122
123 // For strided slices, we have the relationship size = (end - begin) / stride
124 // For slice, we assume stride to be a vector of all ones, yielding the formula
125 // size = (end - begin) therefore we know end = size + begin
126 for (unsigned int i = 0; i < num_dims; i++)
127 {
128 unsigned int revertedIndex = num_dims - i - 1;
129
130 starts.set(i, static_cast<int>(m_begin[revertedIndex]));
131 ends.set(i, static_cast<int>(m_begin[revertedIndex] + m_size[revertedIndex]));
132 }
133
134 return std::make_tuple(starts, ends);
135}
136
David Monahan97451b42020-12-03 09:48:06 +0000137template <typename DataType, typename PayloadType>
138DataType* GetOutputTensorData(unsigned int idx, const PayloadType& data)
139{
140 ITensorHandle* tensorHandle = data.m_Outputs[idx];
141 return reinterpret_cast<DataType*>(tensorHandle->Map());
142}
143
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +0100144} //namespace armnn